// 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
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") ) {
};
// 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
event.preventDefault();
// and execute the function
- return args[this.lastToggle].apply( this, [event] ) || false;
+ return args[this.lastToggle].apply( this, arguments ) || false;
});
},
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]);
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 );
}
}
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();
+});