jquery event: from #2249, adding $.event.proxy to link event handlers, and implementing it on $.event.add, $.fn._toggle and $.fn.one.

It also fixes a bug in $.fn.one that was unbinding ALL the existing handlers.
This commit is contained in:
Ariel Flesler 2008-04-29 22:06:54 +00:00
parent 08836acc30
commit aaff17be42

View file

@ -26,10 +26,10 @@ jQuery.event = {
var fn = handler; var fn = handler;
// Create unique handler function, wrapped around original handler // Create unique handler function, wrapped around original handler
handler = function() { handler = this.proxy( fn, function() {
// Pass arguments and context to original handler // Pass arguments and context to original handler
return fn.apply(this, arguments); return fn.apply(this, arguments);
}; });
// Store data in unique handler // Store data in unique handler
handler.data = data; handler.data = data;
@ -346,6 +346,12 @@ jQuery.event = {
return event; return event;
}, },
proxy: function( fn, proxy ){
// 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++;
return proxy;//so proxy can be declared as an argument
},
special: { special: {
ready: { ready: {
setup: function() { setup: function() {
@ -411,11 +417,12 @@ jQuery.fn.extend({
}, },
one: function( type, data, fn ) { one: function( type, data, fn ) {
var one = jQuery.event.proxy( fn || data, function(event) {
jQuery(this).unbind(event, one);
return (fn || data).apply( this, arguments );
});
return this.each(function(){ return this.each(function(){
jQuery.event.add( this, type, function(event) { jQuery.event.add( this, type, one, fn && data);
jQuery(this).unbind(event);
return (fn || data).apply( this, arguments);
}, fn && data);
}); });
}, },
@ -437,20 +444,24 @@ jQuery.fn.extend({
return undefined; return undefined;
}, },
toggle: function() { toggle: function( fn ) {
// Save reference to arguments for access in closure // Save reference to arguments for access in closure
var args = arguments; var args = arguments, i = 1;
return this.click(function(event) { // link all the functions, so any of them can unbind this click handler
while( i < args.length )
jQuery.event.proxy( fn, args[i++] );
return this.click( jQuery.event.proxy( fn, function(event) {
// Figure out which function to execute // Figure out which function to execute
this.lastToggle = ( this.lastToggle || 0 ) % args.length; this.lastToggle = ( this.lastToggle || 0 ) % i;
// Make sure that clicks stop // Make sure that clicks stop
event.preventDefault(); event.preventDefault();
// and execute the function // and execute the function
return args[ this.lastToggle++ ].apply( this, arguments ) || false; return args[ this.lastToggle++ ].apply( this, arguments ) || false;
}); }));
}, },
hover: function(fnOver, fnOut) { hover: function(fnOver, fnOut) {