Changed the === undefined ready event check to == null since frameElement is usually...
[jquery.git] / src / event.js
index a1d5ed0..014fb73 100644 (file)
@@ -583,7 +583,6 @@ jQuery.each({
        blur: "focusout"
 }, function( orig, fix ){
        var event = jQuery.event,
-               special = event.special,
                handle = event.handle;
        
        function ieHandler() { 
@@ -591,18 +590,18 @@ jQuery.each({
                return handle.apply(this, arguments);
        }
 
-       special[orig] = {
+       event.special[orig] = {
                setup:function() {
                        if ( this.addEventListener )
                                this.addEventListener( orig, handle, true );
                        else
-                               jQuery.event.add( this, fix, ieHandler );
+                               event.add( this, fix, ieHandler );
                }, 
                teardown:function() { 
                        if ( this.removeEventListener )
                                this.removeEventListener( orig, handle, true );
                        else
-                               jQuery.event.remove( this, fix, ieHandler );
+                               event.remove( this, fix, ieHandler );
                }
        };
 });
@@ -694,13 +693,14 @@ jQuery.fn.extend({
 
                return this.click( jQuery.event.proxy( fn, function( event ) {
                        // Figure out which function to execute
-                       this.lastToggle = ( this.lastToggle || 0 ) % i;
+                       var lastToggle = ( jQuery.data( this, 'lastToggle' + fn.guid ) || 0 ) % i;
+                       jQuery.data( this, 'lastToggle' + fn.guid, lastToggle + 1 );
 
                        // Make sure that clicks stop
                        event.preventDefault();
 
                        // and execute the function
-                       return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+                       return args[ lastToggle ].apply( this, arguments ) || false;
                }));
        },
 
@@ -792,6 +792,10 @@ jQuery.extend({
        ready: function() {
                // Make sure that the DOM is not already loaded
                if ( !jQuery.isReady ) {
+                       if ( !document.body ) {
+                               return setTimeout( jQuery.ready, 13 );
+                       }
+
                        // Remember that the DOM is ready
                        jQuery.isReady = true;
 
@@ -839,16 +843,21 @@ function bindReady() {
                // maybe late but safe also for iframes
                document.attachEvent("onreadystatechange", function() {
                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                       if ( document.readyState === "complete" && document.body ) {
+                       if ( document.readyState === "complete" ) {
                                document.detachEvent( "onreadystatechange", arguments.callee );
                                jQuery.ready();
                        }
                });
 
-               // If IE and not an iframe
+               // If IE and not a frame
                // continually check to see if the document is ready
-               // NOTE: DO NOT CHANGE TO ===, FAILS IN IE.
-               if ( document.documentElement.doScroll && window == window.top ) (function() {
+               var toplevel = false;
+
+               try {
+                       toplevel = window.frameElement == null;
+               } catch(e){}
+
+               if ( document.documentElement.doScroll && toplevel ) (function() {
                        if ( jQuery.isReady ) {
                                return;
                        }