Javascript 如何在jQuery中将参数传递给事件处理程序?
jQuery代码如下:Javascript 如何在jQuery中将参数传递给事件处理程序?,javascript,jquery,Javascript,Jquery,jQuery代码如下: $("#myid").click(myfunction); function myfunction(arg1, arg2) {/* something */} 如何在使用jQuery时将参数传递给myfunction?最简单的方法就是这样做(假设您不想将任何事件信息传递给函数) 这将创建一个匿名函数,该函数在触发click事件时调用。这将依次使用您提供的参数调用myfunction() 如果要保留(调用函数时this的值,请设置为触发事件的元素),然后使用调用函数
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
如何在使用jQuery时将参数传递给
myfunction
?最简单的方法就是这样做(假设您不想将任何事件信息传递给函数)
这将创建一个匿名函数,该函数在触发click
事件时调用。这将依次使用您提供的参数调用myfunction()
如果要保留(调用函数时this
的值,请设置为触发事件的元素),然后使用调用函数
您不能以示例所述的方式直接传递引用,否则它的单个参数将是相同的
如果确实希望传递引用,则必须利用jQuery的函数(这是一个跨浏览器的函数包装器)。这允许您传递参数,这些参数在事件
参数之前绑定
$("#myid").click($.proxy(myfunction, null, arg1, arg2));
在本例中,myfunction()
将在其ThisBinding
完好无损的情况下执行(null
不是对象,因此使用触发事件的元素的正常this
值),以及参数(按顺序)arg1
,arg2
最后是jQuery事件
对象,如果不需要它,您可以忽略它(甚至不要在函数的参数中命名它)
您也可以使用jQuery
事件
对象传递数据,但这需要修改myfunction()
以通过event.data.arg1
访问它(与您的问题中提到的函数参数不同),或者至少引入一个手动代理函数,如前一个示例或使用后一个示例生成的代理函数。虽然您当然应该使用Alex的答案,但原型库的“绑定”方法已在Ecmascript 5中标准化,并将很快在浏览器中本机实现。它的工作原理如下:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
还允许您使用on和off方法绑定和解除绑定特定事件处理程序
例如:
$("#myid").off('click', myfunction);
这将从#myid旧线程中解除myfunction处理程序的绑定,但出于搜索目的;尝试:
$(selector).on('mouseover',...);
。。。并检查“数据”参数:
e、 g:
简单:
$(element).on("click", ["Jesikka"], myHandler);
function myHandler(event){
alert(event.data); //passed in "event.data"
}
已经有了很好的答案,但不管怎样,这是我的两分钱。您还可以使用:
$(“#myid”)。单击({arg1:“foo”,arg2:“bar”},myfunction)
听众会像这样:
函数myfunction(事件){
警报(event.data.arg1);
警报(event.data.arg2);
}
请记住,您将在myfunction()中丢失jquery上下文$(this)。要进行维护,请从匿名处理程序调用myfunction(this,arg1,arg2)
。然后,您的函数可以执行myfunction(el,arg1,arg2){alert($(el).val());}
@geoseve:如果您想保留它,请使用myfunction.call(this,arg1,arg2)
。这并不是像问题所问的那样向函数传递参数。它调用的是一个调用另一个函数的函数。在匿名函数中嵌套函数不是一个好主意,因为您无法轻松解除匿名函数的绑定。@geo1701如果您使用自定义名称空间,并且只绑定一次,则可以解除匿名函数的绑定。在大多数情况下,这没关系。但您确实失去了您提到的好处。同意@geo1701,我不得不删除事件处理程序,他的解决方案是唯一有效的。如果您使用此方法,例如,bind()
在该上下文(全局)中将其设置为this
,是否将设置为不同的上下文可能导致单击处理程序将窗口
对象设置为this
,而不是引用#myid
元素?@alex你说得很对。jQuery将把#myid元素绑定到其事件处理程序中的“this”,使用bind方法将覆盖该元素。几年前我写了这篇文章,似乎很难说出我当时的想法。我猜我只是假设阅读我答案的人足够聪明,能够自己弄清楚这些细节。这是一个非常危险的假设。@Travis在撰写本文时(在Breton的答案发表后将近11年),caniuse.com报告说,98.87%的浏览器支持Ecmascript 5。(请参阅)@Stephan My Take-in-Chake评论的目标是@Breton,因为他假设阅读我答案的人足够聪明,能够自己解决这些细节问题,而不是Ecmascript。正如问题所问,这不是向函数传递参数。这就是传递参数的方式(将参数封装在对象中)。这是传递数据的方式,但是调用函数参数是一种延伸。对于公认的答案,这是一个更好的解决方案,因为它使用了推荐的模式,即使用On/Off方法绑定和解除绑定侦听器。如果您认为解除绑定非常罕见,那么您的经验一定非常有限。请不要对别人的贡献嗤之以鼻——这是一个集体知识库,而不是竞争。没有正确或错误的答案。可能是重复的
$("#myid").off('click', myfunction);
$(selector).on('mouseover',...);
function greet( event ) {
alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );
$(element).on("click", ["Jesikka"], myHandler);
function myHandler(event){
alert(event.data); //passed in "event.data"
}