Com código jQuery como:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Como faço para passar argumentos myfunction
ao usar jQuery?
Com código jQuery como:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Como faço para passar argumentos myfunction
ao usar jQuery?
Respostas:
A maneira mais simples é fazer assim (assumindo que você não deseja que nenhuma informação do evento seja passada para a função) ...
$("#myid").click(function() {
myfunction(arg1, arg2);
});
jsFiddle .
Isso cria uma função anônima, que é chamada quando o click
evento é disparado. Isso, por sua vez, chamará myfunction()
com os argumentos que você fornecer.
Se você deseja manter o ThisBinding
(o valor de this
quando a função é chamada, defina como o elemento que disparou o evento), chame a função com call()
.
$("#myid").click(function() {
myfunction.call(this, arg1, arg2);
});
jsFiddle .
Você não pode passar a referência diretamente da forma como seu exemplo afirma, ou seu único argumento será o objeto jQueryevent
.
Se você não quiser passar a referência, você deve aproveitar do jQuery proxy()
função (que é um wrapper cross browser para Function.prototype.bind()
). Isso permite que você passe argumentos, que são vinculados antes do event
argumento.
$("#myid").click($.proxy(myfunction, null, arg1, arg2));
jsFiddle .
Neste exemplo, myfunction()
seria executado com seu ThisBinding
intacto ( null
não é um objeto, portanto, o this
valor normal do elemento que acionou o evento é usado), junto com os argumentos (em ordem) e arg1
, arg2
finalmente, o event
objeto jQuery , que você pode ignorar se não for necessário (nem mesmo nomeie nos argumentos da função).
Você também pode usar o event
objeto jQuery data
para passar dados, mas isso exigiria modificação myfunction()
para acessá-lo via event.data.arg1
(que não são argumentos de função como sua pergunta menciona), ou pelo menos a introdução de uma função de proxy manual como o exemplo anterior ou gerado usando o último exemplo.
myfunction(this, arg1, arg2)
do manipulador anônimo. Então sua função pode fazermyfunction(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'
});
Também permite vincular e desvincular manipuladores de eventos específicos usando os métodos on e off.
Exemplo:
$("#myid").off('click', myfunction);
Isso desvincularia o manipulador de myfunction de #myid
embora você certamente deva usar a resposta de Alex, o método "bind" da biblioteca de protótipos foi padronizado no Ecmascript 5 e logo será implementado em navegadores nativamente. Funciona assim:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
this
definido para um contexto diferente se você usar esse método, por exemplo, bind()
fazê-lo this
nesse contexto (global) pode resultar no manipulador de cliques com o window
objeto this
em vez de uma referência ao #myid
elemento?
people reading my answers are smart enough to figure these details out themselves
, não sobre Ecmascript.
Tópico antigo, mas para fins de pesquisa; experimentar:
$(selector).on('mouseover',...);
... e verifique o parâmetro "data": http://api.jquery.com/on/
por exemplo:
function greet( event ) {
alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );