X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevent.js;h=5f0adff84d2c1a7cfd4dcfb0efaa12df611d8d4d;hb=aaff17be42c434d3a227bf5a8c5875b37c064da7;hp=b72ce7c0710619e682fbe6aa745885980c08801a;hpb=c3cbc5bf98ad9bbed0c416b20f08b63d3b343448;p=jquery.git diff --git a/src/event.js b/src/event.js index b72ce7c..5f0adff 100644 --- a/src/event.js +++ b/src/event.js @@ -26,10 +26,10 @@ jQuery.event = { var fn = handler; // Create unique handler function, wrapped around original handler - handler = function() { + handler = this.proxy( fn, function() { // Pass arguments and context to original handler return fn.apply(this, arguments); - }; + }); // Store data in unique handler handler.data = data; @@ -346,6 +346,12 @@ jQuery.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: { ready: { setup: function() { @@ -411,11 +417,12 @@ jQuery.fn.extend({ }, 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(){ - jQuery.event.add( this, type, function(event) { - jQuery(this).unbind(event); - return (fn || data).apply( this, arguments); - }, fn && data); + jQuery.event.add( this, type, one, fn && data); }); }, @@ -437,20 +444,24 @@ jQuery.fn.extend({ return undefined; }, - toggle: function() { + toggle: function( fn ) { // Save reference to arguments for access in closure - var args = arguments; + var args = arguments, i = 1; + + // 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(function(event) { + return this.click( jQuery.event.proxy( fn, function(event) { // Figure out which function to execute - this.lastToggle = (this.lastToggle||0) % args.length; + this.lastToggle = ( this.lastToggle || 0 ) % i; // Make sure that clicks stop event.preventDefault(); // and execute the function - return args[this.lastToggle++].apply( this, arguments ) || false; - }); + return args[ this.lastToggle++ ].apply( this, arguments ) || false; + })); }, hover: function(fnOver, fnOut) {