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

时间:2009-06-11 04:40:37

标签: javascript jquery

使用jQuery代码:

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

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

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

6 个答案:

答案 0 :(得分:105)

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

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

jsFiddle

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

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

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

jsFiddle

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

如果想要传递引用,则必须利用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访问它(不是< em>函数参数就像你的问题提到的那样),或者至少引入一个像前一个例子那样的手动代理函数或者使用后一个例子生成一个代理函数。

答案 1 :(得分:67)

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

这将解除mymy处理程序与#myid

的绑定

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

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

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

...并查看“data”参数: http://api.jquery.com/on/

e.g:

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

答案 4 :(得分:2)

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

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

监听器看起来像:

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

答案 5 :(得分:1)

<强>简单:

Profile