From 6b729ff7984d9d4d09dff042a3896022dae3783d Mon Sep 17 00:00:00 2001 From: John Resig Date: Thu, 1 Mar 2007 04:54:51 +0000 Subject: [PATCH] Cleaned up how event removing was handled. All expandos are now removed when they are no longer needed. Additionally, a bug where all events are unbound if an incorrect event handler is provided, was fixed. --- src/event/event.js | 48 +++++++++++++++++++++++++++--------------------- src/event/eventTest.js | 11 +++++++++-- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/event/event.js b/src/event/event.js index 4347ae5..e276ab6 100644 --- a/src/event/event.js +++ b/src/event/event.js @@ -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; } }, diff --git a/src/event/eventTest.js b/src/event/eventTest.js index a71e01b..cc97999 100644 --- a/src/event/eventTest.js +++ b/src/event/eventTest.js @@ -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 +}); -- 1.7.10.4