]> source.dussan.org Git - jquery.git/commitdiff
Catch more cases where special events were incorrectly removed.
authorDave Methvin <dave.methvin@gmail.com>
Mon, 14 Nov 2011 01:50:36 +0000 (20:50 -0500)
committerDave Methvin <dave.methvin@gmail.com>
Mon, 14 Nov 2011 01:50:36 +0000 (20:50 -0500)
We can't take the blow-it-all-away shortcut because something in the middle of the list may be a mapped special event. On the bright side, -22!

src/event.js
test/unit/event.js

index e957075639c02084aa18f04f9401bfb36a5eaa61..d56c44a558bff58359803a5aaa2b93ab18a24ca4 100644 (file)
@@ -180,28 +180,23 @@ jQuery.event = {
                        origCount = eventType.length;
                        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 || origType !== type ) {
-                               for ( j = 0; j < eventType.length; j++ ) {
-                                       handleObj = eventType[ j ];
-
-                                       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 );
-                                               }
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               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 );
                                        }
                                }
-                       } else {
-                               // Removing all events
-                               eventType.length = 0;
                        }
 
                        // Remove generic event handler if we removed something and no more handlers exist
index dbfc5d90987ecd051448b5785d45246800c2ae9b..d33ba40d6d7267a747e8008a42ba61403f81d680 100644 (file)
@@ -2462,19 +2462,18 @@ test(".on and .off", function() {
 });
 
 test("special bind/delegate name mapping", function() {
-       expect( 7 );
+       expect( 6 );
 
        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" );
+                       equal( event.handleObj.origType, "slap", "slapped your mammy, " + event.type );
                }
        };
 
        var comeback = function( event ) {
-                       ok( true, "event " + event.type + " triggered" );
+               ok( true, "event " + event.type + " triggered" );
        };
 
        jQuery( '<div><button id="mammy">Are We Not Men?</button></div>' )
@@ -2489,12 +2488,30 @@ test("special bind/delegate name mapping", function() {
                        .off( "click" )
                        .trigger( "swing" )             // delegateType-slap and swing
                .end()
-               .off( "slap swing" )
-               .find( "button " )                      // everything should be gone
+               .off( "slap swing", "button" )
+               .find( "button" )                       // everything should be gone
                        .trigger( "slap" )
                        .trigger( "click" )
                        .trigger( "swing" )
-               .end();
+               .end()
+               .remove();
+       delete jQuery.event.special.slap;
+
+       // Ensure a special event isn't removed by its mapped type
+       jQuery.event.special.gutfeeling = {
+               bindType: "click",
+               delegateType: "click",
+               handle: function( event ) {
+                       equal( event.handleObj.origType, "gutfeeling", "got a gutfeeling" );
+               }
+       };
+       jQuery( '<p>Gut Feeling</p>' )
+               .on( "click", jQuery.noop )
+               .on( "gutfeeling", jQuery.noop )
+               .off( "click" )
+               .trigger( "gutfeeling" )
+               .remove();
+       delete jQuery.event.special.gutfeeling;
 });
 
 test(".on and .off, selective mixed removal (#10705)", function() {