Commit 6b729ff7 authored by John Resig's avatar John Resig

Cleaned up how event removing was handled. All expandos are now removed when...

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.
parent f8fcc952
...@@ -55,35 +55,41 @@ jQuery.event = { ...@@ -55,35 +55,41 @@ jQuery.event = {
// Detach an event or set of events from an element // Detach an event or set of events from an element
remove: function(element, type, handler) { remove: function(element, type, handler) {
if (element.$events) { var events = element.$events, ret;
var i,j,k;
if ( type && type.type ) { // type is actually an event object here if ( events ) {
// type is actually an event object here
if ( type && type.type ) {
handler = type.handler; 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 // remove the given handler for the given type
if ( handler ) if ( handler )
delete element.$events[type][handler.guid]; delete events[type][handler.guid];
// remove all handlers for the given type // remove all handlers for the given type
else else
for ( i in element.$events[type] ) for ( handler in events[type] )
delete element.$events[type][i]; delete events[type][handler];
// remove all handlers // remove generic event handler if no more handlers exist
else for ( ret in events[type] ) break;
for ( j in element.$events ) if ( !ret ) {
this.remove( element, j ); ret = element["on" + type] = undefined;
delete events[type];
// 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; }
// Remove the expando if it's no longer used
for ( ret in events ) break;
if ( !ret )
delete element.$events;
} }
}, },
......
...@@ -15,7 +15,7 @@ test("toggle(Function, Function) - add toggle event and fake a few clicks", func ...@@ -15,7 +15,7 @@ test("toggle(Function, Function) - add toggle event and fake a few clicks", func
}); });
test("unbind(event)", function() { test("unbind(event)", function() {
expect(4); expect(6);
var el = $("#firstp"); var el = $("#firstp");
el.click(function() { el.click(function() {
ok( true, "Fake normal bind" ); ok( true, "Fake normal bind" );
...@@ -29,6 +29,13 @@ test("unbind(event)", function() { ...@@ -29,6 +29,13 @@ test("unbind(event)", function() {
el.click(function() { return; }); el.click(function() { return; });
el.unbind('click'); el.unbind('click');
ok( !el[0].onclick, "Handler is removed" ); // Bug #964 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() { test("trigger(event, [data]", function() {
...@@ -59,4 +66,4 @@ test("bind() with data and trigger() with data", function() { ...@@ -59,4 +66,4 @@ test("bind() with data and trigger() with data", function() {
ok( data.bar == "foo", "Check value of trigger data" ); ok( data.bar == "foo", "Check value of trigger data" );
} }
$("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]); $("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]);
}); });
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment