diff options
author | Dave Methvin <dave.methvin@gmail.com> | 2011-11-10 21:53:07 -0500 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2011-11-10 21:53:07 -0500 |
commit | 774eba33881093efa592d350a831ca1a812428a8 (patch) | |
tree | fddd84abe489c1faac1294a8030da48e9a6d391a /src | |
parent | 5ba7f60822f05d1b5681c938e7ba3479c0f31142 (diff) | |
download | jquery-774eba33881093efa592d350a831ca1a812428a8.tar.gz jquery-774eba33881093efa592d350a831ca1a812428a8.zip |
Avoid collateral damage when removing bindType/delegateType special events.
Diffstat (limited to 'src')
-rw-r--r-- | src/event.js | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/event.js b/src/event.js index cd946dadb..e95707563 100644 --- a/src/event.js +++ b/src/event.js @@ -151,7 +151,7 @@ jQuery.event = { remove: function( elem, types, handler, selector ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, namespaces, origCount, + t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { @@ -162,7 +162,7 @@ jQuery.event = { types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; + type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element @@ -181,22 +181,21 @@ jQuery.event = { namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Only need to loop for special events or selective removal - if ( handler || namespaces || selector || special.remove ) { + if ( handler || namespaces || selector || special.remove || origType !== type ) { for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; - if ( !handler || handler.guid === handleObj.guid ) { - if ( !namespaces || namespaces.test( handleObj.namespace ) ) { - if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } + if ( origType === handleObj.origType && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); } } } |