From da966573c3f3cb083c48cd3ead88e7542937d4df Mon Sep 17 00:00:00 2001 From: jeresig Date: Sat, 13 Feb 2010 06:10:43 -0500 Subject: [PATCH] Make sure that elements that have been removed also have their special events cleaned up. Fixes #6084. --- src/event.js | 4 ++++ src/manipulation.js | 11 ++++++++--- test/unit/event.js | 16 ++++++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/event.js b/src/event.js index 6e65438..d91231e 100644 --- a/src/event.js +++ b/src/event.js @@ -112,6 +112,10 @@ jQuery.event = { if ( special.add ) { special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } } // Add the function to the element's handler list diff --git a/src/manipulation.js b/src/manipulation.js index a58e52b..4e7a31e 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -547,7 +547,7 @@ jQuery.extend({ }, cleanData: function( elems ) { - var data, id, cache = jQuery.cache; + var data, id, cache = jQuery.cache, special = jQuery.event.special; for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { id = elem[ jQuery.expando ]; @@ -556,8 +556,13 @@ jQuery.extend({ data = cache[ id ]; if ( data.events ) { - for ( var event in data.events ) { - removeEvent( elem, event, data.handle ); + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + } else { + removeEvent( elem, type, data.handle ); + } } } diff --git a/test/unit/event.js b/test/unit/event.js index 21167c7..7d66c9c 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -72,7 +72,7 @@ test("bind(), multiple events at once and namespaces", function() { }); test("bind(), namespace with special add", function() { - expect(19); + expect(24); var div = jQuery("
").bind("test", function(e) { ok( true, "Test event fired." ); @@ -97,7 +97,9 @@ test("bind(), namespace with special add", function() { handler.apply( this, arguments ); }; }, - remove: function() {} + remove: function() { + ok(true, "Remove called."); + } }; div.bind("test.a", {x: 1}, function(e) { @@ -119,7 +121,17 @@ test("bind(), namespace with special add", function() { // Should trigger 2 div.trigger("test.b"); + // Should trigger 4 div.unbind("test"); + + div = jQuery("
").bind("test", function(e) { + ok( true, "Test event fired." ); + }); + + // Should trigger 2 + div.appendTo("#main").remove(); + + delete jQuery.event.special.test; }); test("bind(), no data", function() { -- 1.7.10.4