mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Make event.currentTarget the delegate node, always.
This lets us use currentTarget for its intended use and avoids creating a non-standard delegateTarget property.
This commit is contained in:
parent
9fabe2028f
commit
d28ab68699
18
src/event.js
18
src/event.js
@ -418,6 +418,7 @@ jQuery.event = {
|
|||||||
|
|
||||||
// Use the fix-ed jQuery.Event rather than the (read-only) native event
|
// Use the fix-ed jQuery.Event rather than the (read-only) native event
|
||||||
args[0] = event;
|
args[0] = event;
|
||||||
|
event.currentTarget = this;
|
||||||
|
|
||||||
// Determine handlers that should run if there are delegated events
|
// Determine handlers that should run if there are delegated events
|
||||||
// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
|
// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
|
||||||
@ -447,21 +448,15 @@ jQuery.event = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the remaining (bound) handlers in case they're changed
|
// Add the remaining (directly- bound) handlers
|
||||||
handlers = handlers.slice( delegateCount );
|
if ( handlers.length ) {
|
||||||
|
handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
|
||||||
|
}
|
||||||
|
|
||||||
// Run delegates first; they may want to stop propagation beneath us
|
|
||||||
event.delegateTarget = this;
|
|
||||||
for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
|
for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
|
||||||
matched = handlerQueue[ i ];
|
matched = handlerQueue[ i ];
|
||||||
dispatch( matched.elem, event, matched.matches, args );
|
dispatch( matched.elem, event, matched.matches, args );
|
||||||
}
|
}
|
||||||
delete event.delegateTarget;
|
|
||||||
|
|
||||||
// Run non-delegated handlers for this level
|
|
||||||
if ( handlers.length && !event.isPropagationStopped() ) {
|
|
||||||
dispatch( this, event, handlers, args );
|
|
||||||
}
|
|
||||||
|
|
||||||
return event.result;
|
return event.result;
|
||||||
},
|
},
|
||||||
@ -613,7 +608,6 @@ function dispatch( target, event, handlers, args ) {
|
|||||||
specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
|
specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
|
||||||
j, handleObj, ret;
|
j, handleObj, ret;
|
||||||
|
|
||||||
event.currentTarget = target;
|
|
||||||
for ( j = 0; j < handlers.length && !event.isImmediatePropagationStopped(); j++ ) {
|
for ( j = 0; j < handlers.length && !event.isImmediatePropagationStopped(); j++ ) {
|
||||||
handleObj = handlers[ j ];
|
handleObj = handlers[ j ];
|
||||||
|
|
||||||
@ -932,7 +926,7 @@ jQuery.fn.extend({
|
|||||||
if ( one === 1 ) {
|
if ( one === 1 ) {
|
||||||
origFn = fn;
|
origFn = fn;
|
||||||
fn = function( event ) {
|
fn = function( event ) {
|
||||||
jQuery.event.remove( event.delegateTarget || this, event );
|
jQuery.event.remove( event.currentTarget || this, event );
|
||||||
return origFn.apply( this, arguments );
|
return origFn.apply( this, arguments );
|
||||||
};
|
};
|
||||||
// Use same guid so caller can remove using origFn
|
// Use same guid so caller can remove using origFn
|
||||||
|
@ -1476,7 +1476,7 @@ test(".live()/.die()", function() {
|
|||||||
// Test this, target and currentTarget are correct
|
// Test this, target and currentTarget are correct
|
||||||
jQuery("span#liveSpan1").live("click", function(e){
|
jQuery("span#liveSpan1").live("click", function(e){
|
||||||
equals( this.id, "liveSpan1", "Check the this within a live handler" );
|
equals( this.id, "liveSpan1", "Check the this within a live handler" );
|
||||||
equals( e.currentTarget.id, "liveSpan1", "Check the event.currentTarget within a live handler" );
|
equals( e.currentTarget, document, "Check the event.currentTarget within a live handler" );
|
||||||
equals( e.target.nodeName.toUpperCase(), "A", "Check the event.target within a live handler" );
|
equals( e.target.nodeName.toUpperCase(), "A", "Check the event.target within a live handler" );
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2008,7 +2008,7 @@ test(".delegate()/.undelegate()", function() {
|
|||||||
// Test this, target and currentTarget are correct
|
// Test this, target and currentTarget are correct
|
||||||
jQuery("#body").delegate("span#liveSpan1", "click", function(e){
|
jQuery("#body").delegate("span#liveSpan1", "click", function(e){
|
||||||
equals( this.id, "liveSpan1", "Check the this within a delegate handler" );
|
equals( this.id, "liveSpan1", "Check the this within a delegate handler" );
|
||||||
equals( e.currentTarget.id, "liveSpan1", "Check the event.currentTarget within a delegate handler" );
|
equals( e.currentTarget, document.body, "Check the event.currentTarget within a delegate handler" );
|
||||||
equals( e.target.nodeName.toUpperCase(), "A", "Check the event.target within a delegate handler" );
|
equals( e.target.nodeName.toUpperCase(), "A", "Check the event.target within a delegate handler" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user