【问题标题】:Using JavaScript to cycle through elements with numbers in the ID [duplicate]使用 JavaScript 循环遍历 ID 中带有数字的元素 [重复]
【发布时间】:2015-03-21 12:24:16
【问题描述】:

我有兴趣循环浏览我的页面上的一些 div,这些 div 中的 ID 中有数字。

这就是我目前所拥有的......

    var count = 1;

    while(count != 12) {
        $('#logo-'.concat(count).concat(' > img')).click(function() {
            if($('#info-'.concat(count)).hasClass('dropdown-active')) {
                $('#info-'.concat(count)).slideUp();
                $('#info-'.concat(count)).removeClass('dropdown-active');
            } else {
                $('#info-'.concat(count)).slideDown();
                $('#info-'.concat(count)).addClass('dropdown-active');
            }
            return false;
        });

        count++;
    }

计数在到达 if 语句时似乎停止工作。

所以页面上的 ID 是 logo-1、info-1、logo-2、info-2 等...

【问题讨论】:

  • 我想补充一点,如果我手动输入数字,代码就可以工作。我只是在寻找一种更有效的方法。
  • 你需要使用闭包。查看链接的副本。
  • 旁注:'#logo-'.concat(count).concat(' > img') 与 '#logo-' + count + ' > img') 相同,后者可以说更具可读性。还有faster.

标签: javascript jquery html loops while-loop


【解决方案1】:

您可以更干净地执行此操作,如下所示:

while(count != 12) {
    $('#logo-' + count + ' > img').click(function() {
        var origin = $(this).parent(),
            targetId = '#info-' + origin[0].id.substring(5),
            target = $(targetId);
        if(target.hasClass('dropdown-active')) {
            target.slideUp();
            target.removeClass('dropdown-active');
        } else {
            target.slideDown();
            target.addClass('dropdown-active');
        }
        return false;
    });

    count++;
}

但最好将所有徽标赋予相同的类(例如“徽标”),然后您可以放弃 while 循环:

$('.logo > img').click(function() {
     var origin = $(this).parent(),
         targetId = '#info-' + origin[0].id.substring(5),
         target = $(targetId);
     if(target.hasClass('dropdown-active')) {
         target.slideUp();
         target.removeClass('dropdown-active');
     } else {
         target.slideDown();
         target.addClass('dropdown-active');
     }
});

编辑: 正如 Karl-André Gagnon 在 cmets 中指出的那样,您还可以使用 $('[id^="logo-"]') 作为给他们一个类的替代方法,并且仍然使用 no-while-loop 方法。

从 ID 中解析数字的另一种方法是将数字存储在 data-num 属性中:

<div class='logo' data-num='1'>...</div>

然后用 substring 方法代替 var origin... 的东西,你会:

var num = $(this).parent().data('num'),
    target = $('#info-' + num);

【讨论】:

  • 同意上课。此外,属性选择器可能也可以工作$('[id^="logo-"]')。
  • @Karl-AndréGagnon 好点。谢谢!
  • 谢谢,但我相信我需要这些数字,因为每张图片都会显示不同的信息,因此使用了 slideDown 和 slideUp。所以我不希望它们同时显示。
  • @JamesGeorgeDunn 抱歉,我忽略了您拥有#logo 和#info 的事实。我已经更新了我的答案以解决这个问题。
  • 完美!非常感谢,@JLRishe
【解决方案2】:

虽然 JLRishe 的答案更可取,但这里有一个关于使用闭包的学术演示:

var count = 1;

while(count != 12) {
    (function(id){
        $('#logo-'.concat(id).concat(' > img')).click(function() {
            if($('#info-'.concat(id)).hasClass('dropdown-active')) {
                $('#info-'.concat(id)).slideUp();
                $('#info-'.concat(id)).removeClass('dropdown-active');
            } else {
                $('#info-'.concat(id)).slideDown();
                $('#info-'.concat(id)).addClass('dropdown-active');
            }
            return false;
        });
    }(count));

    count++;
}

通过调用函数并将值作为参数传递,您创建了一个新范围,因此 id 将在 click 函数中保持其值。我不一定会推荐这种方法(此外,您的代码效率低下),但希望它是闭包和作用域的有趣演示。

【讨论】:

  • 太棒了!非常感谢 JDB!
  • @JamesGeorgeDunn - 谢谢,但您应该强烈考虑 JLRishe 的方法。从长远来看,它可能会好得多。
  • 绝对有价值的信息。 +1
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2019-02-09
  • 2021-07-31
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2019-08-19
相关资源
最近更新 更多