Javascript 如何将参数(事件除外)传递给事件处理程序?
下面的代码显示3个按钮,标签为“1”、“2”和“3”。单击每个按钮将警告标签Javascript 如何将参数(事件除外)传递给事件处理程序?,javascript,event-handling,Javascript,Event Handling,下面的代码显示3个按钮,标签为“1”、“2”和“3”。单击每个按钮将警告标签 <!DOCTYPE html> <html> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script type="text/ja
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
var a = [1, 2, 3];
$.each(a, function(i, ai) {
$('<button />').text(i).appendTo('body')
.click(function() {alert(i);});
});
});
</script>
</head>
<body>
</body>
</html>
$(函数(){
VarA=[1,2,3];
$。每个(a,函数(i,ai){
$('').text(i).appendTo('正文')
。单击(函数(){alert(i);});
});
});
但是,如果我用foo
替换function(){alert(I);}
,并定义function foo(){alert(I);}
,我将得到变量I未定义的错误
那么,如何将参数(事件除外)传递给事件处理程序呢?我认为,如果事件处理程序长且复杂,将事件处理程序(foo()
在本例中)定义为命名函数将使代码更简洁。$(function(){
$(function() {
var a = [1, 2, 3];
$.each(a, function(i, ai) {
$('<button />').text(i).appendTo('body')
.click(function() { foo.apply(this,[i]);});
});
});
function foo( i )
{
alert( i + " : " + $(this).text() );
}
VarA=[1,2,3];
$。每个(a,函数(i,ai){
$('').text(i).appendTo('正文')
.click(function(){foo.apply(this[i]);});
});
});
功能foo(i)
{
警报(i+”:“+$(this.text());
}
第三种方法,我通常使用的方法是调用返回处理程序的函数。像这样:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
var bindFoo = function(x) {
return function() {alert(x);};
};
$(function() {
var a = [1, 2, 3];
$.each(a, function(i, ai) {
$('<button />').text(i).appendTo('body')
.click(bindFoo(i));
});
});
</script>
</head>
<body>
</body>
</html>
var bindFoo=函数(x){
返回函数(){alert(x);};
};
$(函数(){
VarA=[1,2,3];
$。每个(a,函数(i,ai){
$('').text(i).appendTo('正文')
。单击(bindFoo(i));
});
});
我在绑定函数中使用x
,只是为了将它与主代码块中的I
区分开来。如果您查看,您会看到它有一个可选的eventData
参数。例如,这将起作用:
function foo(e)
{
alert(e.data.theI);
}
$(function ()
{
var a = [1, 2, 3];
$.each(a, function (i, ai)
{
$('<button/>').text(i).appendTo('body').bind("click", {theI: i}, foo);
});
});
函数foo(e)
{
警报(如data.theI);
}
$(函数()
{
VarA=[1,2,3];
$。每个(a,函数(i,ai)
{
$('').text(i).appendTo('body').bind(单击,{theI:i},foo);
});
});
不应该是foo.call
<代码>应用获取数组。为什么要创建数组<代码>foo.call(这个,我)代码>会简单一点。我喜欢这个答案。我想Ghommy应该使用apply()
而不是call()
,因为apply()
可以用来传递多个参数,这是一种更一般的情况。@powerboy-两者都可以用来传递多个参数apply()
要求将数据打包到数组中,而call()
可以在scope参数之后使用任意数量的参数。所以这两条语句是等价的:myfunction.apply(this,[1,2,3,'four'))
和myfunction.call(this,1,2,3,'four')
。实际上,我发现使用call()
更容易、更自然。