将数据传递给on()

时间:2012-10-12 17:10:16

标签: jquery

var i = 1;

$('select').on("change", i, function () {
    alert(i);
});

这没有做任何事情,我不确定为什么......

var i = 1;

$('select').change(function (i) {
    alert(i);
});

这是返回[object Object]

无论如何,我希望能够将int传递给change方法,但却看不出我做错了什么。

4 个答案:

答案 0 :(得分:4)

事件中函数中的参数不是您传递的参数,而是event object,并且在事件运行时由jQuery传递。

您可以将值传递给.on,其值将显示在event.data

示例:

var i = 1;

$('select').on("change", i, function (e) {
    alert(e.data);  // e.data will be the variable passed to .on
});

或者,因为你在函数之外声明i,你可以在里面使用它。

var i = 1;

$('select').on("change", function (e) {
    alert(i);
});

答案 1 :(得分:2)

以下代码应该有效,因为i是一个全局变量

var i = 1;

$('select').on("change", function() {
    alert(i);
});

或者如果您想将i作为数据传递给事件,那么这也可以起作用:

var i = 1;
$('select').on("change", {i: i}, function(e) {
    alert(e.data.i);
});

答案 2 :(得分:1)

  

这是返回[object Object]

$('select').change(function (i) {
    alert(i);
});

这不会将变量i传递给您的事件处理程序,这是定义您的处理程序,第一个参数具有名称 i 。触发事件时,将调用处理程序并将当前事件对象作为第一个参数传递,即i引用event object [docs]

您只能在调用时将参数传递给您,而不是定义时。


  

这没有做任何事情,我不确定为什么......

$('select').on("change", i, function () {
   alert(i);
});

传递给.on的第二个参数应该是一个包含选择器的字符串,它允许事件委托,或者一个包含对象的对象,你想在事件处理程序中使用它。这些数据不会直接传递给事件处理程序,它可以通过事件对象的.data属性访问(见下文)。


话虽如此,你有两个可能性:

  1. 使用您的处理程序作为闭包,例如Omar shows in his answer。但请注意,每当i更改并执行事件处理程序时,它将具有当前值i

  2. 如果您想“传递”i的快照,即您定义事件处理程序时的值,您可以如前所述将数据对象传递给{ {1}}您可以通过处理程序中的事件对象访问:

    .on

    有关详细信息,请参阅event.data [docs]


  3. 我强烈建议您阅读.on [docs]文档。它包含很多关于jQuery如何工作和事件处理的信息。您似乎还不完全了解函数的工作原理,在这种情况下,您应该查看MDN JavaScript指南section about functions

答案 3 :(得分:0)

这可能有所帮助:

1)当你做

$('select').on('change',i,function(ev){...}); 

然后将值i分配给ev.data。 所以在你的处理程序中,你可以这样做:

$('select').on('change',i,function(ev){
     alert(ev.data)
}); 

2)为了更好地理解为什么第二个不能按预期工作,因为在JS中,你可能想要了解JS中的作用域如何工作。

但总结是,您在警报中访问的变量i是事件处理程序范围中的局部变量。

function(i){ alert(i) },// here i is the event object .

只需将变量名称更改为x,它就可以正常工作。

var i = 1;

$('select').change(function (x) {
    alert(i);
});