Fixed [1993] although it actually wasn't a bug in the core but rather a misunderstand...
[jquery.git] / src / event.js
index 070ed9e..7c718f4 100644 (file)
@@ -19,7 +19,7 @@ jQuery.event = {
                        
                // if data is passed, bind to handler 
                if( data != undefined ) { 
-                       // Create temporary function pointer to original handler 
+                       // Create temporary function pointer to original handler 
                        var fn = handler; 
 
                        // Create unique handler function, wrapped around original handler 
@@ -171,8 +171,13 @@ jQuery.event = {
                                data.shift();
 
                        // Handle triggering of extra function
-                       if ( extra && extra.apply( element, data ) === false )
-                               val = false;
+                       if ( extra ) {
+                               // call the extra function and tack the current return value on the end for possible inspection
+                               var ret = extra.apply( element, data.concat( val ) );
+                               // if anything is returned, give it precedence and have it overwrite the previous value
+                               if (ret !== undefined)
+                                       val = ret;
+                       }
 
                        // Trigger the native events (except for clicks on links)
                        if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
@@ -253,11 +258,11 @@ jQuery.event = {
                };
                
                // Fix target property, if necessary
-               if ( !event.target && event.srcElement )
-                       event.target = event.srcElement;
+               if ( !event.target )
+                       event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
                                
                // check if target is a textnode (safari)
-               if (jQuery.browser.safari && event.target.nodeType == 3)
+               if ( event.target.nodeType == 3 )
                        event.target = originalEvent.target.parentNode;
 
                // Add relatedTarget, if necessary
@@ -333,7 +338,7 @@ jQuery.fn.extend({
                        event.preventDefault();
                        
                        // and execute the function
-                       return args[this.lastToggle].apply( this, [event] ) || false;
+                       return args[this.lastToggle].apply( this, arguments ) || false;
                });
        },
 
@@ -348,7 +353,8 @@ jQuery.fn.extend({
                        while ( parent && parent != this ) try { parent = parent.parentNode; } catch(error) { parent = this; };
                        
                        // If we actually just moused on to a sub-element, ignore it
-                       if ( parent == this ) return false;
+                       if ( parent == this ) 
+                               return true;
                        
                        // Execute the right function
                        return (event.type == "mouseover" ? fnOver : fnOut).apply(this, [event]);
@@ -401,7 +407,7 @@ jQuery.extend({
                                jQuery.readyList = null;
                        }
                        // Remove event listener to avoid memory leak
-                       if ( jQuery.browser.mozilla || jQuery.browser.opera )
+                       if ( document.removeEventListener )
                                document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
                }
        }
@@ -424,37 +430,34 @@ function bindReady(){
        if ( readyBound ) return;
        readyBound = true;
 
-       // If Mozilla is used
-       if ( jQuery.browser.mozilla || jQuery.browser.opera )
+       // Mozilla, Opera and webkit nightlies currently support this event
+       if ( document.addEventListener )
                // Use the handy event callback
                document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
        
        // If Safari or IE is used
-       else {
-               // Continually check to see if the document is ready
-               function timer(){
-                       try {
-                               // If IE is used, use the trick by Diego Perini
-                               // http://javascript.nwbox.com/IEContentLoaded/
-                               if ( jQuery.browser.msie || document.readyState != "loaded" && document.readyState != "complete" )
-                                       document.documentElement.doScroll("left");
-       
-                               // and execute any waiting functions
-                               jQuery.ready();
-                       } catch( error ) {
-                               setTimeout( timer, 0 );
-                       }
+       // Continually check to see if the document is ready
+       if  (jQuery.browser.msie || jQuery.browser.safari ) (function(){
+               try {
+                       // If IE is used, use the trick by Diego Perini
+                       // http://javascript.nwbox.com/IEContentLoaded/
+                       if ( jQuery.browser.msie || document.readyState != "loaded" && document.readyState != "complete" )
+                               document.documentElement.doScroll("left");
+               } catch( error ) {
+                       return setTimeout( arguments.callee, 0 );
                }
 
-               timer();
-       }
+               // and execute any waiting functions
+               jQuery.ready();
+       })();
 
        // A fallback to window.onload, that will always work
        jQuery.event.add( window, "load", jQuery.ready );
 }
 
 // Prevent memory leaks in IE
-if ( jQuery.browser.msie )
-       jQuery(window).bind("unload", function() {
-               $("*").add([document, window]).unbind();
-       });
+// And prevent errors on refresh with events like mouseover
+// Window isn't included so as not to unbind existing unload events
+jQuery(window).bind("unload", function() {
+       jQuery("*").add(document).unbind();
+});