From 34cb5b5812db50d921f7c7a0c398eb68167b3da3 Mon Sep 17 00:00:00 2001
From: Brandon Aaron <brandon.aaron@gmail.com>
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