var fn = handler;
// Create unique handler function, wrapped around original handler
- handler = this.proxy( fn, function() {
- // Pass arguments and context to original handler
- return fn.apply(this, arguments);
- });
+ handler = this.proxy( fn );
// Store data in unique handler
handler.data = data;
},
proxy: function( fn, proxy ){
+ proxy = proxy || function(){ return fn.apply(this, arguments); };
// Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
// So proxy can be declared as an argument
remove++;
});
- if ( remove <= 1 )
+ if ( remove < 1 )
jQuery.event.remove( this, namespaces[0], liveHandler );
}
}
},
live: function( type, fn ){
- jQuery(document).bind( liveConvert(type, this.selector), this.selector, fn );
+ var proxy = jQuery.event.proxy( fn );
+ proxy.guid += this.selector;
+
+ jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
return this;
},
die: function( type, fn ){
- jQuery(document).unbind( liveConvert(type, this.selector), fn );
+ jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector } : null );
return this;
}
});
});
test(".live()/.die()", function() {
- expect(30);
+ expect(34);
var submit = 0, div = 0, livea = 0, liveb = 0;
jQuery("#anchor2").trigger("click");
equals( window.location.hash, hash, "e.preventDefault() worked" );
jQuery("#anchor2").die("click");
+
+ // Test binding the same handler to multiple points
+ var called = 0;
+ function callback(){ called++; return false; }
+
+ jQuery("#nothiddendiv").live("click", callback);
+ jQuery("#anchor2").live("click", callback);
+
+ jQuery("#nothiddendiv").trigger("click");
+ equals( called, 1, "Verify that only one click occurred." );
+
+ jQuery("#anchor2").trigger("click");
+ equals( called, 2, "Verify that only one click occurred." );
+
+ // Make sure that only one callback is removed
+ jQuery("#anchor2").die("click", callback);
+
+ jQuery("#nothiddendiv").trigger("click");
+ equals( called, 3, "Verify that only one click occurred." );
+
+ jQuery("#anchor2").trigger("click");
+ equals( called, 3, "Verify that only one click occurred." );
+
+ // Cleanup
+ jQuery("#nothiddendiv").die("click", callback);
});
/*