【问题标题】:jQuery click-function passing parametersjQuery click-function 传递参数
【发布时间】:2011-10-17 16:42:13
【问题描述】:

我想为数组中的所有元素分配 jQuery 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:我基本上只是为了避免手动为所有数组元素键入它。

【问题讨论】:

    标签: javascript jquery parameters click closures


    【解决方案1】:

    只需删除名为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 .click() 文档中的eventData 参数。

    【讨论】:

    • 谢谢,我不知道。我的实际问题与在内部函数中使用 i 有关,而 ShankarSangoli 的回答为我解决了这个问题。
    【解决方案2】:

    当您的点击处理程序被调用时,第一个参数是事件数据。 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?

    【讨论】:

    • 你误解了我的问题。我不想要 DOM 元素,我想要对象。 'mybox' 是一个 JavaScript 对象,而不是一个 jQuery 元素!
    • 在您的更新中,您是否刚刚删除了第二个参数?因为那不适合我。 mybox 在函数中是 unknown
    • 不,不是。我刚刚编辑了答案以解释发生了什么。
    • 哦,那一定是因为我在实际代码中使用了doStuffWithParameter(mybox.myarray[i]);?那我该如何解决呢?
    • 其实,ShankarSangoli 的回答正好说明了这种情况!
    【解决方案3】:

    您可以借助 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")]);    
        });
    }   
    

    【讨论】:

    • 从技术上讲,这个答案仍然不正确——额外的回调函数参数将掩盖外部范围内的真实变量。
    • 哦,是的,我错过了删除该参数,感谢@Alnitak 我已经编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2015-06-23
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多