X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=055de724db404a6af3863aaebc499d45ca6bc502;hb=4fd730dca797f495e7473cbfc97a7decf40ff24a;hp=0f976a060d52d61755dee5fdbf6dca6492188d77;hpb=45dfa3b0fc49718c4f00600d1e25a129601d08ee;p=jquery.git diff --git a/src/event.js b/src/event.js index 0f976a0..055de72 100644 --- a/src/event.js +++ b/src/event.js @@ -517,6 +517,14 @@ var withinElement = function( event ) { // handle event if we actually just moused on to a non sub-element jQuery.event.handle.apply( this, arguments ); } + +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); }; // Create mouseenter and mouseleave events @@ -525,11 +533,11 @@ jQuery.each({ mouseout: "mouseleave" }, function( orig, fix ) { jQuery.event.special[ fix ] = { - setup: function(){ - jQuery.event.add( this, orig, withinElement, fix ); + setup: function(data){ + jQuery.event.add( this, orig, data && data.selector ? delegate : withinElement, fix ); }, - teardown: function(){ - jQuery.event.remove( this, orig, withinElement ); + teardown: function(data){ + jQuery.event.remove( this, orig, data && data.selector ? delegate : withinElement ); } }; }); @@ -575,7 +583,6 @@ jQuery.each({ blur: "focusout" }, function( orig, fix ){ var event = jQuery.event, - special = event.special, handle = event.handle; function ieHandler() { @@ -583,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 ); } }; }); @@ -743,15 +750,23 @@ function liveHandler( event ) { jQuery.each( jQuery.data( this, "events" ).live || [], function( i, fn ) { if ( fn.live === event.type ) { - var elem = jQuery( event.target ).closest( fn.selector )[0]; + var elem = jQuery( event.target ).closest( fn.selector, event.currentTarget )[0], + related; if ( elem ) { - elems.push({ elem: elem, fn: fn }); + // Those two events require additional checking + if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) { + related = jQuery( event.relatedTarget ).closest( fn.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, fn: fn }); + } } } }); elems.sort(function( a, b ) { - return jQuery.data( a.elem, "closest" ) - jQuery.data( b.elem, "closest" ); + return a.closer - b.closer; }); jQuery.each(elems, function() { @@ -822,7 +837,8 @@ function bindReady() { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent("onreadystatechange", function() { - if ( document.readyState === "complete" ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" && document.body ) { document.detachEvent( "onreadystatechange", arguments.callee ); jQuery.ready(); } @@ -830,7 +846,8 @@ function bindReady() { // If IE and not an iframe // continually check to see if the document is ready - if ( document.documentElement.doScroll && window === window.top ) (function() { + // NOTE: DO NOT CHANGE TO ===, FAILS IN IE. + if ( document.documentElement.doScroll && window == window.top ) (function() { if ( jQuery.isReady ) { return; } @@ -853,9 +870,9 @@ function bindReady() { jQuery.event.add( window, "load", jQuery.ready ); } -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + - "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," + - "change,select,submit,keydown,keypress,keyup,error").split(","), function( i, name ) { +jQuery.each( ("blur focus load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( fn ) {