aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Methvin <dave.methvin@gmail.com>2011-11-10 21:53:07 -0500
committerDave Methvin <dave.methvin@gmail.com>2011-11-10 21:53:07 -0500
commit774eba33881093efa592d350a831ca1a812428a8 (patch)
treefddd84abe489c1faac1294a8030da48e9a6d391a /src
parent5ba7f60822f05d1b5681c938e7ba3479c0f31142 (diff)
downloadjquery-774eba33881093efa592d350a831ca1a812428a8.tar.gz
jquery-774eba33881093efa592d350a831ca1a812428a8.zip
Avoid collateral damage when removing bindType/delegateType special events.
Diffstat (limited to 'src')
-rw-r--r--src/event.js29
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 );
}
}
}