Commit 66975de2 authored by jeresig's avatar jeresig

Remove the .bind(name, fn, thisObject) and promote jQuery.event.proxy() to...

Remove the .bind(name, fn, thisObject) and promote jQuery.event.proxy() to jQuery.proxy() as alternative to handling scoping on callbacks. Fixes #5736.
parent a00e63ea
...@@ -35,7 +35,7 @@ jQuery.event = { ...@@ -35,7 +35,7 @@ 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 = this.proxy( fn ); handler = jQuery.proxy( fn );
// Store data in unique handler // Store data in unique handler
handler.data = data; handler.data = data;
...@@ -405,24 +405,6 @@ jQuery.event = { ...@@ -405,24 +405,6 @@ jQuery.event = {
return event; return event;
}, },
proxy: function( fn, proxy, thisObject ) {
if ( proxy !== undefined && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
// FIXME: Should proxy be redefined to be applied with thisObject if defined?
proxy = proxy || function() {
return fn.apply( thisObject !== undefined ? thisObject : 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
return proxy;
},
special: { special: {
ready: { ready: {
// Make sure the ready event is setup // Make sure the ready event is setup
...@@ -474,6 +456,24 @@ jQuery.event = { ...@@ -474,6 +456,24 @@ jQuery.event = {
} }
}; };
jQuery.event.proxy = jQuery.proxy = function( fn, proxy, thisObject ) {
if ( proxy !== undefined && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
// FIXME: Should proxy be redefined to be applied with thisObject if defined?
proxy = proxy || function() {
return fn.apply( thisObject !== undefined ? thisObject : 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 || jQuery.event.guid++;
// So proxy can be declared as an argument
return proxy;
};
jQuery.Event = function( src ) { jQuery.Event = function( src ) {
// Allow instantiation without the 'new' keyword // Allow instantiation without the 'new' keyword
if ( !this.preventDefault ) { if ( !this.preventDefault ) {
...@@ -759,7 +759,7 @@ if ( document.addEventListener ) { ...@@ -759,7 +759,7 @@ if ( document.addEventListener ) {
} }
jQuery.each(["bind", "one"], function( i, name ) { jQuery.each(["bind", "one"], function( i, name ) {
jQuery.fn[ name ] = function( type, data, fn, thisObject ) { jQuery.fn[ name ] = function( type, data, fn ) {
// Handle object literals // Handle object literals
if ( typeof type === "object" ) { if ( typeof type === "object" ) {
for ( var key in type ) { for ( var key in type ) {
...@@ -773,12 +773,13 @@ jQuery.each(["bind", "one"], function( i, name ) { ...@@ -773,12 +773,13 @@ jQuery.each(["bind", "one"], function( i, name ) {
fn = data; fn = data;
data = undefined; data = undefined;
} }
fn = thisObject === undefined ? fn : jQuery.event.proxy( fn, thisObject );
var handler = name === "one" ? jQuery.event.proxy( fn, function( event ) { var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
jQuery( this ).unbind( event, handler ); jQuery( this ).unbind( event, handler );
return fn.apply( this, arguments ); return fn.apply( this, arguments );
}) : fn; }) : fn;
return type === "unload" ? this.one(type, data, handler, thisObject) : this.each(function() {
return type === "unload" ? this.one(type, data, handler) : this.each(function() {
jQuery.event.add( this, type, handler, data ); jQuery.event.add( this, type, handler, data );
}); });
}; };
...@@ -820,10 +821,10 @@ jQuery.fn.extend({ ...@@ -820,10 +821,10 @@ jQuery.fn.extend({
// link all the functions, so any of them can unbind this click handler // link all the functions, so any of them can unbind this click handler
while ( i < args.length ) { while ( i < args.length ) {
jQuery.event.proxy( fn, args[ i++ ] ); jQuery.proxy( fn, args[ i++ ] );
} }
return this.click( jQuery.event.proxy( fn, function( event ) { return this.click( jQuery.proxy( fn, function( event ) {
// Figure out which function to execute // Figure out which function to execute
var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
...@@ -840,17 +841,16 @@ jQuery.fn.extend({ ...@@ -840,17 +841,16 @@ jQuery.fn.extend({
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}, },
live: function( type, data, fn, thisObject ) { live: function( type, data, fn ) {
if ( jQuery.isFunction( data ) ) { if ( jQuery.isFunction( data ) ) {
if ( fn !== undefined ) {
thisObject = fn;
}
fn = data; fn = data;
data = undefined; data = undefined;
} }
jQuery( this.context ).bind( liveConvert( type, this.selector ), { jQuery( this.context ).bind( liveConvert( type, this.selector ), {
data: data, selector: this.selector, live: type data: data, selector: this.selector, live: type
}, fn, thisObject ); }, fn );
return this; return this;
}, },
......
...@@ -232,8 +232,8 @@ test("bind(), with different this object", function() { ...@@ -232,8 +232,8 @@ test("bind(), with different this object", function() {
}; };
jQuery("#firstp") jQuery("#firstp")
.bind("click", handler1, thisObject).click().unbind("click", handler1) .bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1)
.bind("click", data, handler2, thisObject).click().unbind("click", handler2); .bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2);
ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." ); ok( !jQuery.data(jQuery("#firstp")[0], "events"), "Event handler unbound when using different this object and data." );
}); });
...@@ -706,15 +706,15 @@ test(".live()/.die()", function() { ...@@ -706,15 +706,15 @@ test(".live()/.die()", function() {
jQuery("#foo").trigger("click", true).die("click"); jQuery("#foo").trigger("click", true).die("click");
// Test binding with different this object // Test binding with different this object
jQuery("#foo").live("click", function(e){ equals( this.foo, "bar", "live with event scope" ); }, { foo: "bar" }); jQuery("#foo").live("click", jQuery.proxy(function(e){ equals( this.foo, "bar", "live with event scope" ); }, { foo: "bar" }));
jQuery("#foo").trigger("click").die("click"); jQuery("#foo").trigger("click").die("click");
// Test binding with different this object, event data, and trigger data // Test binding with different this object, event data, and trigger data
jQuery("#foo").live("click", true, function(e, data){ jQuery("#foo").live("click", true, jQuery.proxy(function(e, data){
equals( e.data, true, "live with with different this object, event data, and trigger data" ); equals( e.data, true, "live with with different this object, event data, and trigger data" );
equals( this.foo, "bar", "live with with different this object, event data, and trigger data" ); equals( this.foo, "bar", "live with with different this object, event data, and trigger data" );
equals( data, true, "live with with different this object, event data, and trigger data") equals( data, true, "live with with different this object, event data, and trigger data")
}, { foo: "bar" }); }, { foo: "bar" }));
jQuery("#foo").trigger("click", true).die("click"); jQuery("#foo").trigger("click", true).die("click");
// Verify that return false prevents default action // Verify that return false prevents default action
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment