X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;ds=inline;f=src%2Fevent.js;h=055de724db404a6af3863aaebc499d45ca6bc502;hb=4fd730dca797f495e7473cbfc97a7decf40ff24a;hp=f9c5fae014b90420ad24a971438e541880efa8bd;hpb=81bfd9b870f658ce00eec48ea48a84d69c20bf05;p=jquery.git diff --git a/src/event.js b/src/event.js index f9c5fae..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() {