Skip to content
Permalink
Browse files
Cleaned up how event removing was handled. All expandos are now remov…
…ed when they are no longer needed. Additionally, a bug where all events are unbound if an incorrect event handler is provided, was fixed.
  • Loading branch information
jeresig committed Mar 1, 2007
1 parent f8fcc95 commit 6b729ff7984d9d4d09dff042a3896022dae3783d
Showing with 36 additions and 23 deletions.
  1. +27 −21 src/event/event.js
  2. +9 −2 src/event/eventTest.js
@@ -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"}]);
});
});

0 comments on commit 6b729ff

Please sign in to comment.