jQuery在for循环中定义click事件(从对象数组中获取click事件信息)

时间:2014-02-18 09:12:04

标签: javascript jquery object for-loop

让我们从代码开始:

function PopupDrop(n) { // function to trigger on click
    for (var i=0; i<Popups.length; i++) {
        if (($(Popups[i]['w']).css('display') != 'none') && (n != Popups[i]['w'])) {
            $(Popups[i]['w']).stop(true,true).slideUp(150);
        }

    // Poping actual popup
    if ($(n).css('display') == 'none') $(n).slideDown(150);
    else $(n).slideUp(150);
}
var Popups = [ // Array of ID which we click, and ID's which we send to click trigger function
    {c:'#Payment-Selection',w:'#Cards-Popup'},
    {c:'#Drop-SY',w:'#Start-Years'},
    {c:'#Drop-SM',w:'#Start-Months'}];
function ActivatePopups() { // Defining click events function
    for (var i=0; i<Popups.length; i++) { 
        var Wt = Popups[i]['w'];
        $(Popups[i]['c']).click(function() {
            PopupDrop(Wt); console.log(Wt);
        });
    console.log('On click here: '+Popups[i]['c']+' do this:'+Popups[i]['w']); }
}
ActivatePopups();

Basicaly我正在做自定义选择框,当其他人滑下时必须滑动。这里的问题是Fuinction ActivatePopups控制台会记录它应该是什么样的,但是当我点击不同的定义元素(例如#Payment-Selection,#Drop-Sy ......)时,点击不会触发下拉列表和控制台。日志在所有点击中显示相同的ID ...如果我定义没有for循环的点击,例如。 $('#Payment-Selection')。点击(function(){PopupDrop('#Cards-Popup');}); 它作为魅力......但是因为我有很多differend ID我想用for循环缩短代码。

任何想法为什么会发生?

http://jsfiddle.net/aw7bt/1/

3 个答案:

答案 0 :(得分:1)

我使用回调函数修复它:

function PopupCallBack(x) {
   return function (e) {
      PopupDrop(x);
   };
}
function ActivatePopups() {
    for (var i=0; i<Popups.length; i++) { var Wt = Popups[i]['w']; $(Popups[i]['c']).click(PopupCallBack(Wt));
    console.log('On click here: '+Popups[i]['c']+' do this:'+Popups[i]['w']); }
}

有关问题的更多信息:Closures: Line by Line explanation of "Javascript: Good Parts" example?

感谢Tomasz Kowalczyk的回答

答案 1 :(得分:0)

可以通过多种方式解决此问题。您可以使用闭包,或将Popups变量设为对象(具有键值对,如var Popups = {'Payment-Selection':'Cards-Popup',...),但需要对代码进行最少修改的解决方案是使用自定义属性,像这样:

$(Popups[i]['c']).attr('Wt', Popups[i]['w']).click(function () {
        var Wt = this.getAttribute('Wt');
        PopupDrop(Wt);
        console.log(Wt);
});

DEMO

答案 2 :(得分:0)

也许这对您有用:http://jsfiddle.net/5vWA4/

我以不同的方式实现它,但imho更简单。

function ActivatePopups() {
    $('.popup-activator').click(function(){
        console.log($(this).data('w'));
    });
}