Commit 774eba33 authored by Dave Methvin's avatar Dave Methvin

Avoid collateral damage when removing bindType/delegateType special events.

parent 5ba7f608
...@@ -151,7 +151,7 @@ jQuery.event = { ...@@ -151,7 +151,7 @@ jQuery.event = {
remove: function( elem, types, handler, selector ) { remove: function( elem, types, handler, selector ) {
var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), 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; j, events, special, handle, eventType, handleObj;
if ( !elemData || !(events = elemData.events) ) { if ( !elemData || !(events = elemData.events) ) {
...@@ -162,7 +162,7 @@ jQuery.event = { ...@@ -162,7 +162,7 @@ jQuery.event = {
types = jQuery.trim( hoverHack( types || "" ) ).split(" "); types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
for ( t = 0; t < types.length; t++ ) { for ( t = 0; t < types.length; t++ ) {
tns = rtypenamespace.exec( types[t] ) || []; tns = rtypenamespace.exec( types[t] ) || [];
type = tns[1]; type = origType = tns[1];
namespaces = tns[2]; namespaces = tns[2];
// Unbind all events (on this namespace, if provided) for the element // Unbind all events (on this namespace, if provided) for the element
...@@ -181,13 +181,14 @@ jQuery.event = { ...@@ -181,13 +181,14 @@ jQuery.event = {
namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
// Only need to loop for special events or selective removal // 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++ ) { for ( j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ]; handleObj = eventType[ j ];
if ( !handler || handler.guid === handleObj.guid ) { if ( origType === handleObj.origType &&
if ( !namespaces || namespaces.test( handleObj.namespace ) ) { ( !handler || handler.guid === handleObj.guid ) &&
if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) { ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
eventType.splice( j--, 1 ); eventType.splice( j--, 1 );
if ( handleObj.selector ) { if ( handleObj.selector ) {
...@@ -198,8 +199,6 @@ jQuery.event = { ...@@ -198,8 +199,6 @@ jQuery.event = {
} }
} }
} }
}
}
} else { } else {
// Removing all events // Removing all events
eventType.length = 0; eventType.length = 0;
......
...@@ -2461,6 +2461,41 @@ test(".on and .off", function() { ...@@ -2461,6 +2461,41 @@ test(".on and .off", function() {
jQuery("#onandoff").remove(); jQuery("#onandoff").remove();
}); });
test("special bind/delegate name mapping", function() {
expect( 7 );
jQuery.event.special.slap = {
bindType: "click",
delegateType: "swing",
handle: function( event ) {
equal( event.handleObj.origType, "slap", "event type is correct for " + event.type );
equal( event.target.id, "mammy", "slapped your mammy" );
}
};
var comeback = function( event ) {
ok( true, "event " + event.type + " triggered" );
};
jQuery( '<div><button id="mammy">Are We Not Men?</button></div>' )
.on( "slap", "button", jQuery.noop )
.on( "swing", "button", comeback )
.find( "button" )
.on( "slap", jQuery.noop )
.on( "click", comeback )
.trigger( "click" ) // bindType-slap and click
.off( "slap" )
.trigger( "click" ) // click
.off( "click" )
.trigger( "swing" ) // delegateType-slap and swing
.end()
.off( "slap swing" )
.find( "button " ) // everything should be gone
.trigger( "slap" )
.trigger( "click" )
.trigger( "swing" )
.end();
});
test(".on and .off, selective mixed removal (#10705)", function() { test(".on and .off, selective mixed removal (#10705)", function() {
expect(7); expect(7);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment