Cleaned up how event removing was handled. All expandos are now removed when they...
authorJohn Resig <jeresig@gmail.com>
Thu, 1 Mar 2007 04:54:51 +0000 (04:54 +0000)
committerJohn Resig <jeresig@gmail.com>
Thu, 1 Mar 2007 04:54:51 +0000 (04:54 +0000)
src/event/event.js
src/event/eventTest.js

index 4347ae5..e276ab6 100644 (file)
@@ -55,35 +55,41 @@ jQuery.event = {
 
        // Detach an event or set of events from an element
        remove: function(element, type, handler) {
-               if (element.$events) {
-                       var i,j,k;
-                       if ( type && type.type ) { // type is actually an event object here
+               var events = element.$events, ret;
+
+               if ( events ) {
+                       // type is actually an event object here
+                       if ( type && type.type ) {
                                handler = type.handler;
-                               type    = type.type;
+                               type = type.type;
                        }
                        
-                       if (type && element.$events[type])
+                       if ( !type ) {
+                               for ( type in events )
+                                       this.remove( element, type );
+
+                       } else if ( events[type] ) {
                                // remove the given handler for the given type
                                if ( handler )
-                                       delete element.$events[type][handler.guid];
-                                       
+                                       delete events[type][handler.guid];
+                               
                                // remove all handlers for the given type
                                else
-                                       for ( i in element.$events[type] )
-                                               delete element.$events[type][i];
-                                               
-                       // remove all handlers          
-                       else
-                               for ( j in element.$events )
-                                       this.remove( element, j );
-                       
-                       // remove event handler if no more handlers exist
-                       for ( k in element.$events[type] )
-                               if (k) {
-                                       k = true;
-                                       break;
+                                       for ( handler in events[type] )
+                                               delete events[type][handler];
+
+                               // remove generic event handler if no more handlers exist
+                               for ( ret in events[type] ) break;
+                               if ( !ret ) {
+                                       ret = element["on" + type] = undefined;
+                                       delete events[type];
                                }
-                       if (!k) element["on" + type] = null;
+                       }
+
+                       // Remove the expando if it's no longer used
+                       for ( ret in events ) break;
+                       if ( !ret )
+                               delete element.$events;
                }
        },
 
index a71e01b..cc97999 100644 (file)
@@ -15,7 +15,7 @@ test("toggle(Function, Function) - add toggle event and fake a few clicks", func
 });
 
 test("unbind(event)", function() {
-       expect(4);
+       expect(6);
        var el = $("#firstp");
        el.click(function() {
                ok( true, "Fake normal bind" );
@@ -29,6 +29,13 @@ test("unbind(event)", function() {
        el.click(function() { return; });
        el.unbind('click');
        ok( !el[0].onclick, "Handler is removed" ); // Bug #964
+
+       el.click(function() { return; });
+       el.unbind('change',function(){ return; });
+       ok( el[0].onclick, "Extra handlers weren't accidentally removed." );
+
+       el.unbind('click');
+       ok( !el[0].$events, "Removed the events expando after all handlers are unbound." );
 });
 
 test("trigger(event, [data]", function() {
@@ -59,4 +66,4 @@ test("bind() with data and trigger() with data", function() {
                ok( data.bar == "foo", "Check value of trigger data" );
        }
        $("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]);
-});
\ No newline at end of file
+});