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

Edw*_*usk 90 javascript jquery

使用jQuery代码:

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

function myfunction(arg1, arg2) {/* something */}
Run Code Online (Sandbox Code Playgroud)

如何myfunction在使用jQuery时传递参数?

ale*_*lex 108

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

$("#myid").click(function() {
    myfunction(arg1, arg2);
});
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

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

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

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

您不能以您的示例所声明的方式直接传递引用,或者它的单个参数将是jQuery event对象.

如果您确实想要传递引用,则必须利用jQuery的proxy()功能(这是一个跨浏览器包装器Function.prototype.bind()).这允许您传递在参数之前绑定的event参数.

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

在这个例子中,myfunction()将执行它的ThisBinding完整(null不是一个对象,所以this使用触发事件的元素的正常值),以及参数(按顺序)arg1,arg2最后是jQuery event对象,你可以忽略如果它不是必需的(甚至不在函数的参数中命名).

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

  • @geosteve:如果你想保留它,请使用`myfunction.call(this,arg1,arg2)`. (11认同)
  • 请记住,您会在myfunction()中丢失jquery上下文$(this)。为了维护,请从匿名处理程序中调用`myfunction(this,arg1,arg2)`。然后您的函数可以执行`myfunction(el,arg1,arg2){alert($(el).val()); }` (2认同)

Geo*_*kos 70

$("#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'
});
Run Code Online (Sandbox Code Playgroud)

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

例:

$("#myid").off('click', myfunction);
Run Code Online (Sandbox Code Playgroud)

这将取消绑定#myid的myfunction处理程序

  • 如果您认为解除绑定非常罕见,那么您必须拥有非常有限的经验.请不要poo poo来自他人 - 这是一个集体知识基础,而不是竞争.没有正确或错误的答案. (7认同)
  • 它是接受答案的更好解决方案,因为它使用On/Off方法使用推荐的绑定和解除绑定侦听器模式. (6认同)
  • 这就是你传递参数的方法(你将它们包装在一个对象中). (4认同)

Bre*_*ton 11

虽然你肯定应该使用Alex的答案,但原型库的"绑定"方法已经在Ecmascript 5中标准化,很快就会在浏览器中实现.它的工作原理如下:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常危险的假设. (12认同)
  • 如果你使用这个方法,将`this`设置为不同的上下文,例如,`bind()在该上下文(全局)中将它设置为`this`可能会导致具有`window`对象的click处理程序为`这个`而不是对`#myid`元素的引用? (2认同)
  • @alex你是对的.jQuery会在其事件处理程序中将#myid元素绑定到"this",并且使用bind方法将覆盖它.几年前我写这篇文章看起来很难说我当时的想法.我想我只是假设阅读我的答案的人都足够聪明,可以自己计算出这些细节. (2认同)

小智 6

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

$(selector).on('mouseover',...);
Run Code Online (Sandbox Code Playgroud)

...并查看"数据"参数: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 );
Run Code Online (Sandbox Code Playgroud)


Leo*_*Leo 5

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

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

听者看起来像:

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