jQuery单击函数传递参数

时间:2011-08-01 18:58:57

标签: javascript jquery parameters click closures

我想为数组中的所有元素分配jQuery click-function。但另外,我需要从click-function中访问数组。希望消息来源更清楚:

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click(function(event, mybox) {  
        event.preventDefault();
        doStuffWithParameter(mybox);    
    });
}   

// mybox is a JavaScript object (not jQuery-element!), myarray is an array, jqelem is a jQueryelement ala $("div.myclass");

问题似乎与function(event, mybox)有关,显然这不起作用,即mybox在函数中是unknown。我想我有点'理解为什么它不能这样工作,但是如何实现呢?

PS:我基本上只是为了避免手动为所有数组元素键入它。

3 个答案:

答案 0 :(得分:3)

只需删除名为mybox的<无用的第二个回调函数参数。

如果mybox在外部块的范围内,它也将在内部回调函数的范围内!

如果您需要知道回调中i的适当值,那么您可以执行event registration-time binding

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click({i: i}, function(event) {  
        // use "event.data.i" to access i's value
        var my_i = event.data.i;
    });
}   

地图{i : i}与jQuery eventData文档中的.click()参数相对应。

答案 1 :(得分:1)

调用click处理程序时,第一个参数是事件数据。 jQuery没有传递第二个参数。

更新:使用闭包转到mybox对象(请注意我删除了第二个参数)

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click(function(event) { 
        event.preventDefault();
        // here's the trick to get the correct i
        (function(item) {
               return function() {
                         doStuffWithParameter(mybox.myarray[item]);
               };
         })(i);

        // you can access any object from parent scope here 
        // (except i, to get to right i, you need another trick), 
        // effectively creating a closure   
        // e.g. doOtherStuff(myarray)
    });
}

在此处阅读有关闭包的更多信息:http://jibbering.com/faq/notes/closures/
在这里:How do JavaScript closures work?

答案 2 :(得分:1)

您可以获取jquery数据属性的帮助

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.data("arrayIndex", i).click(function(event) {  
        event.preventDefault();
        doStuffWithParameter(mybox.myarray[$(this).data("arrayIndex")]);    
    });
}