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

IT技术 javascript jquery
2021-01-22 06:22:04

使用 jQuery 代码,例如:

$("#myid").click(myfunction);

function myfunction(arg1, arg2) {/* something */}

myfunction使用 jQuery 时如何传递参数

6个回答

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

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

js小提琴

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

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

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

js小提琴

您不能按照示例所述的方式直接传递引用,或者它的单个参数将是jQuery eventobject

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

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

js小提琴

在这个例子中,myfunction()将与要执行其ThisBinding完整的(null不是一个对象,所以正常this从而引发所使用的事件的元素的值),其中参数(按顺序)沿arg1arg2并且最后jQuery的event对象,则可以忽略如果不需要(甚至不要在函数的参数中命名)。

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

正如问题所问的那样,这不是将参数传递给函数。它正在调用一个调用另一个函数的函数。在匿名函数中嵌套函数不是一个好主意,因为您无法轻松解除匿名函数的绑定。
2021-03-16 06:22:04
请记住,您将丢失 myfunction() 中的 jquery 上下文 $(this)。要维护,请myfunction(this, arg1, arg2)从匿名处理程序调用然后你的功能可以做myfunction(el, arg1, arg2) { alert($(el).val()); }
2021-03-30 06:22:04
同意@geo1701,我不得不删除事件处理程序,而他的解决方案只是一个有效的解决方案。
2021-04-04 06:22:04
@geosteve:如果您想保留它,请使用myfunction.call(this, arg1, arg2).
2021-04-05 06:22:04
@geo1701 如果您使用自定义命名空间并且只绑定一次,则可以。对于大多数用途,没问题。但是你确实失去了你提到的那个好处。
2021-04-06 06:22:04
$("#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);

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

如果您认为解除绑定非常罕见,那么您的经验一定非常有限。请不要便便他人的贡献——这是一个集体知识库,而不是一场比赛。没有正确或错误的答案。
2021-03-30 06:22:04
这是您传递数据的方式,但将它们称为函数参数是一种延伸。
2021-04-02 06:22:04
正如问题所问的那样,这不是将参数传递给函数。
2021-04-10 06:22:04
这就是您传递参数的方式(将它们包装在一个对象中)。
2021-04-14 06:22:04
这是对已接受答案的更好解决方案,因为它使用推荐的使用 On/Off 方法绑定和取消绑定侦听器的模式。
2021-04-14 06:22:04

虽然您当然应该使用 Alex 的答案,但原型库的“绑定”方法已在 Ecmascript 5 中标准化,并且很快将在浏览器中本地实现。它是这样工作的:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
this被设置为不同的上下文中,如果您使用此方法,例如,bind()它向荷兰国际集团this在这方面(全球)可能会导致具有该单击处理window对象this,而不是给一个参考#myid要素?
2021-03-16 06:22:04
@Travis 在撰写本文时(在 Breton 的回答之后将近 11 年),caniuse.com 报告说98.87%的浏览器支持 Ecmascript 5 (参见caniuse.com/#search=ECMAScript%205
2021-03-23 06:22:04
这是一个非常危险的假设。
2021-03-26 06:22:04
@Stephan 我半开玩笑的评论是针对@Breton 的假设people reading my answers are smart enough to figure these details out themselves,而不是关于 Ecmascript。
2021-03-26 06:22:04
@alex 你说得对。jQuery 将在其事件处理程序中将#myid 元素绑定到“this”,并且使用 bind 方法将覆盖它。几年前我写了这篇文章,看起来很难说我当时在想什么。我想我只是假设阅读我的答案的人足够聪明,可以自己弄清楚这些细节。
2021-03-28 06:22:04

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

$(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 );

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

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

听者看起来像:

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