From 34cb5b5812db50d921f7c7a0c398eb68167b3da3 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Sun, 25 Feb 2007 19:36:29 +0000 Subject: [PATCH] Fix for #964 --- ChangeLog.txt | 1 + src/event/event.js | 30 ++++++++++++++++++++++++------ src/event/eventTest.js | 6 +++++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index df48486..f98b8bf 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -4,6 +4,7 @@ === 1.1.2 === +* Event handlers (like element.onclick) are now removed when no more functions are bound to the event. * Fixed DOM Manipulations for form elements. * Fixed jQuery.isFunction to return false on nodes. * Fixed jQuery.className.has, escaping regex characters in className (for metadata) diff --git a/src/event/event.js b/src/event/event.js index e7f920f..fb7f820 100644 --- a/src/event/event.js +++ b/src/event/event.js @@ -55,18 +55,36 @@ jQuery.event = { // Detach an event or set of events from an element remove: function(element, type, handler) { - if (element.$events) - if ( type && type.type ) - delete element.$events[ type.type ][ type.handler.guid ]; - else if (type && element.$events[type]) + if (element.$events) { + var i,j,k; + if ( type && type.type ) { // type is actually an event object here + handler = type.handler; + type = type.type; + } + + if (type && element.$events[type]) + // remove the given handler for the given type if ( handler ) delete element.$events[type][handler.guid]; + + // remove all handlers for the given type else - for ( var i in element.$events[type] ) + for ( i in element.$events[type] ) delete element.$events[type][i]; + + // remove all handlers else - for ( var j in element.$events ) + 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; + } + if (!k) element["on" + type] = null; + } }, trigger: function(type, data, element) { diff --git a/src/event/eventTest.js b/src/event/eventTest.js index 9615e0b..a71e01b 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(3); + expect(4); var el = $("#firstp"); el.click(function() { ok( true, "Fake normal bind" ); @@ -25,6 +25,10 @@ test("unbind(event)", function() { ok( true, "Fake onebind" ); }); el.click().click(); + + el.click(function() { return; }); + el.unbind('click'); + ok( !el[0].onclick, "Handler is removed" ); // Bug #964 }); test("trigger(event, [data]", function() { -- 1.7.10.4