callLater and IE

22 views
Skip to first unread message

Jonathan Marshall

unread,
Aug 21, 2007, 10:52:00 AM8/21/07
to MochiKit
Hi,

I'm not sure if this is a bug in Mochikit, or my error.

The following do not work in IE 6:

<script>
callLater(1, window.print);
callLater(2, alert, 'drink beer');
</script>

yet these do:
<script>
function f() {
window.print();
}
function g() {
alert('drink beer');
}
callLater(1, f);
callLater(2, g);
</script>

Works beautifully in Firefox though.Tried with Mochikit 1.3.1 and a
recent dump from SVN.

Any thoughts?
Jon.

Bob Ippolito

unread,
Aug 21, 2007, 11:11:20 AM8/21/07
to Jonathan Marshall, MochiKit

Some of these built-in methods and functions aren't actual JavaScript
functions and aren't compatible with Function.prototype.apply, so
using MochiKit directly on them may not work. I think there's a
workaround for it in MochiKIt that makes it work in Firefox and maybe
Safari but I guess that workaround doesn't work properly in IE6.

-bob

Arnar Birgisson

unread,
Aug 21, 2007, 11:26:05 AM8/21/07
to Bob Ippolito, Jonathan Marshall, MochiKit
On 8/21/07, Bob Ippolito <b...@redivi.com> wrote:
> Some of these built-in methods and functions aren't actual JavaScript
> functions and aren't compatible with Function.prototype.apply, so
> using MochiKit directly on them may not work. I think there's a
> workaround for it in MochiKIt that makes it work in Firefox and maybe
> Safari but I guess that workaround doesn't work properly in IE6.

They are proper functions in Firefox and I believe also in Safari.
This is a known problem in IE which doesn't expose the proper Function
interface on it's built-ins.

There *is* a workaround in MochiKit, applied in Base.bind by wrapping
the function in Base._wrapDumbFunction. Maybe the condition that is
used to check if that workaround should be applied needs revision.
Currently it's
if (typeof(func) == "function" && typeof(func.apply) == "undefined") {

I don't have time atm or the proper debugging tools to test this in
IE, but if there are no volunteers I'll have a look sometime.

Arnar

Jonathan Marshall

unread,
Aug 21, 2007, 11:38:46 AM8/21/07
to Arnar Birgisson, Bob Ippolito, MochiKit
On 8/21/07, Arnar Birgisson <arn...@gmail.com> wrote:

There *is* a workaround in MochiKit, applied in Base.bind by wrapping
the function in Base._wrapDumbFunction. Maybe the condition that is
used to check if that workaround should be applied needs revision.
Currently it's
if (typeof(func) == "function" && typeof(func.apply) == "undefined") {

I don't have time atm or the proper debugging tools to test this in
IE, but if there are no volunteers I'll have a look sometime.

Arnar


Changing that to:
if (typeof(func) == "object" && typeof( func.apply) == "undefined") {

works for me.
 


Arnar Birgisson

unread,
Aug 21, 2007, 12:00:29 PM8/21/07
to Jonathan Marshall, Bob Ippolito, MochiKit
On 8/21/07, Jonathan Marshall <jond...@googlemail.com> wrote:
> Changing that to:
> if (typeof(func) == "object" && typeof( func.apply) == "undefined") {
> works for me.

Good. Would you be able to add some tests using your examples and
submit them as well as the fix as a patch? Then we can test it on the
various platforms and commit it if everything works.

Arnar

Jonathan Marshall

unread,
Aug 22, 2007, 7:03:48 AM8/22/07
to MochiKit
All ready, however when I try to submit a ticket I am told:
Internal Error: Submission rejected as potential spam (Akismet says
content is spam)

The patch is:

Index: tests/test_Base.js
===================================================================
--- tests/test_Base.js (revision 1312)
+++ tests/test_Base.js (working copy)
@@ -26,6 +26,9 @@
t.is( bind(boundFunc, undefined, "foo")(), "self foo", "boundFunc
partial no self change" );
t.is( bind(boundFunc, not_self, "foo")(), "not self foo",
"boundFunc partial self change" );

+ t.is( typeof(bind(alert).im_func.apply), "function", true, "bind
alert worked" );
+ t.is( typeof(bind(window.print).im_func.apply), "function", "bind
window.print worked" );
+
// test method
not_self = {"toString": function () { return "not self"; } };
self = {"toString": function () { return "self"; } };
Index: MochiKit/Base.js
===================================================================
--- MochiKit/Base.js (revision 1312)
+++ MochiKit/Base.js (working copy)
@@ -607,7 +607,7 @@
var im_preargs = func.im_preargs;
var im_self = func.im_self;
var m = MochiKit.Base;
- if (typeof(func) == "function" && typeof(func.apply) ==
"undefined") {
+ if (typeof(func) == "object" && typeof(func.apply) ==
"undefined") {
// this is for cases where JavaScript sucks ass and gives
you a
// really dumb built-in function like alert() that
doesn't have
// an apply

I'm not 100% happy with the test patch however as it tests internal
behaviour of bind rather than testing binds' interface, however I
don't know how to non-intrusively test that bind will work with alert
& window.print.

On Aug 21, 5:00 pm, "Arnar Birgisson" <arna...@gmail.com> wrote:

Reply all
Reply to author
Forward
0 new messages