如何在jQuery中将参数传递给事件处理程序?


Answers:


110

最简单的方法是这样做(假设您不希望将任何事件信息传递给该函数)...

$("#myid").click(function() {
    myfunction(arg1, arg2);
});

jsFiddle

这将创建一个匿名函数,click事件触发时将调用该匿名函数。这将依次调用myfunction()您提供的参数。

如果要保留ThisBindingthis调用函数时的值,设置为触发事件的元素),请使用调用函数call()

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});

jsFiddle

您不能以示例所陈述的方式直接传递引用,否则它的单个参数将是jQuery eventobject

如果您确实想传递引用,则必须利用jQuery的proxy()功能(这是的跨浏览器包装Function.prototype.bind())。这使您可以传递参数,这必将之前event说法。

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   

jsFiddle

在此示例中,myfunction()ThisBinding完整无缺地执行(null不是对象,因此将this使用触发事件的元素的常规值)以及参数(按顺序)arg1arg2最后是jQuery event对象,您可以忽略该参数如果不是必需的(甚至不要在函数的参数中命名)。

您还可以使用jQuery event对象data来传递数据,但这需要进行修改myfunction()才能通过进行访问event.data.arg1(不是像您提到的问题那样的函数参数),或者至少要引入手动代理函数(如前一个示例或生成的一个)使用后一个示例。


2
请记住,您会在myfunction()中丢失jquery上下文$(this)。要进行维护,请myfunction(this, arg1, arg2)从匿名处理程序调用。然后您的函数就可以了myfunction(el, arg1, arg2) { alert($(el).val()); }
lambinator

11
@geosteve:如果要保留它,请使用myfunction.call(this, arg1, arg2)
Alex

1
并没有按照问题的要求将参数传递给函数。它正在调用一个函数,而该函数又调用了另一个函数。在匿名函数内部嵌套函数不是一个好主意,因为您不能轻松地解除绑定匿名函数。
乔治·菲利帕科斯

1
@ geo1701如果使用自定义名称空间并且仅绑定一次就可以。在大多数情况下,都可以。但是您确实失去了您提到的好处。
Alex

1
同意@ geo1701,我不得不删除事件处理程序,而他的解决方案只是可行的。
Pavel K

76
$("#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'
});

还允许您使用on和off方法来绑定和取消绑定特定的事件处理程序。

例:

$("#myid").off('click', myfunction);

这将使myfunction处理程序与#myid解除绑定


并没有按照问题的要求将参数传递给函数。
亚历克斯

4
这就是传递参数的方式(将它们包装在一个对象中)。
乔治·菲利帕科斯

这是您传递数据的方式,但是调用它们的函数参数很麻烦。
亚历克斯

6
这是对已接受答案的更好解决方案,因为它使用建议的通过On / Off方法绑定和取消绑定侦听器的模式。
乔治·菲利帕科斯

7
如果您认为解除绑定非常罕见,那么您的经验必须非常有限。请不要大声疾呼别人的贡献-这是一个集体知识基础,而不是竞争。没有正确或错误的答案。
George Filippakos

12

尽管您当然应该使用Alex的答案,但是Ecmascript 5中已对原型库的“绑定”方法进行了标准化,并将很快在本机浏览器中实现。它是这样的:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));

2
this如果使用此方法,将设置为其他上下文,例如,在该上下文中将bind()其设置为this(全局)可能会导致单击处理程序具有window对象this而不是对#myid元素的引用?
Alex

2
@alex你说的很对。jQuery将在其事件处理程序中将#myid元素绑定到“ this”,并且使用bind方法将覆盖它。几年前,我写了这篇文章,似乎很难说出我当时的想法。我想我只是假设阅读我的答案的人足够聪明,可以自己弄清楚这些细节。
布列塔尼

12
这是一个非常危险的假设。
特拉维斯

@Travis在撰写本文时(距布雷顿回答了将近11年了),caniuse.com报告称Ecmascript 5受98.87%的浏览器支持。(见caniuse.com/#search=ECMAScript%205
斯蒂芬

@Stephan我的嘲讽评论是针对@Breton的假设people reading my answers are smart enough to figure these details out themselves,而不是Ecmascript。
特拉维斯

6

旧线程,但出于搜索目的;尝试:

$(selector).on('mouseover',...);

...并检查“数据”参数:http : //api.jquery.com/on/

例如:

function greet( event ) {
  alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );

4

已经有好答案了,但是无论如何,这是我的两分钱。您还可以使用:

$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)

监听器看起来像:

function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }


2

简单:

$(element).on("click", ["Jesikka"],  myHandler);

function myHandler(event){
   alert(event.data);     //passed in "event.data"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.