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:
parent
08836acc30
commit
aaff17be42
33
src/event.js
33
src/event.js
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue