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 = {
// 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;
}
},
......
......@@ -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
});
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