Con código jQuery como:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
¿Cómo paso argumentos myfunctionmientras uso jQuery?
Con código jQuery como:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
¿Cómo paso argumentos myfunctionmientras uso jQuery?
Respuestas:
La forma más sencilla es hacerlo así (asumiendo que no desea que la información del evento se pase a la función) ...
$("#myid").click(function() {
myfunction(arg1, arg2);
});
jsFiddle .
Esto crea una función anónima, que se llama cuando clickse activa el evento. Esto a su vez llamará myfunction()con los argumentos que proporciones.
Si desea mantener el ThisBinding(el valor de thiscuando se invoca la función, establecido en el elemento que desencadenó el evento), llame a la función con call().
$("#myid").click(function() {
myfunction.call(this, arg1, arg2);
});
jsFiddle .
No puede pasar la referencia directamente en la forma en que indica su ejemplo, o su único argumento será el objeto jQueryevent .
Si usted no quiere pasar la referencia, debe aprovechar de jQuery proxy()función (que es un envoltorio de navegadores para Function.prototype.bind()). Esto le permite pasar argumentos, que están vinculados antes del eventargumento.
$("#myid").click($.proxy(myfunction, null, arg1, arg2));
jsFiddle .
En este ejemplo, myfunction()se ejecutaría con su ThisBindingintacto ( nullno es un objeto, por lo thisque se usa el valor normal del elemento que desencadenó el evento), junto con los argumentos (en orden) arg1, arg2y finalmente el eventobjeto jQuery , que puede ignorar si no es necesario (ni siquiera lo nombre en los argumentos de la función).
También puede usar el eventobjeto jQuery datapara pasar datos, pero esto requeriría modificarlo myfunction()para acceder a él a través de event.data.arg1(que no son argumentos de función como menciona su pregunta), o al menos introducir una función de proxy manual como el ejemplo anterior o uno generado utilizando el último ejemplo.
myfunction(this, arg1, arg2)desde el controlador anónimo. Entonces su función puede hacerlomyfunction(el, arg1, arg2) { alert($(el).val()); }
myfunction.call(this, arg1, arg2).
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction);
function myfunction(e) {
var arg1 = e.data.arg1;
var arg2 = e.data.arg2;
alert(arg1);
alert(arg2);
}
//call method directly:
myfunction({
arg1: 'hello agian',
arg2: 'bye again'
});
También le permite vincular y desvincular controladores de eventos específicos utilizando los métodos on y off.
Ejemplo:
$("#myid").off('click', myfunction);
Esto desvincularía el controlador myfunction de #myid
Aunque ciertamente debería usar la respuesta de Alex, el método "bind" de la biblioteca prototipo se ha estandarizado en Ecmascript 5 y pronto se implementará en los navegadores de forma nativa. Funciona así:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
thisSe establecerá en un contexto diferente si usa este método, por ejemplo, si bind()lo hace thisen ese contexto (global) puede resultar en que el controlador de clic tenga el windowobjeto thisen lugar de una referencia al #myidelemento?
people reading my answers are smart enough to figure these details out themselves, no sobre Ecmascript.
Hilo antiguo, pero con fines de búsqueda; tratar:
$(selector).on('mouseover',...);
... y consulte el parámetro "datos": http://api.jquery.com/on/
p.ej:
function greet( event ) {
alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );