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.
This commit is contained in:
parent
f8fcc9525d
commit
6b729ff798
|
@ -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
|
||||||
});
|
});
|
||||||
|
|
||||||
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() {
|
||||||
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() {
|
||||||
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"}]);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue