【问题标题】:How to make this JavaScript code more efficient? [closed]如何让这段 JavaScript 代码更高效? [关闭]
【发布时间】:2013-06-11 17:33:03
【问题描述】:

我目前正在为每个具有特定类的第 4 个 div 添加一个类。但是,是否可以轻松计算它们并将其自动添加到每 4 个 div 中?因为目前我正在这样做:

$(".item:eq(0)").addClass('first');
$(".item:eq(4)").addClass('first');
$(".item:eq(8)").addClass('first');
$(".item:eq(12)").addClass('first');
$(".item:eq(16)").addClass('first');

这意味着如果有 100 个这样的 div,我需要有这么多行。谢谢。

【问题讨论】:

标签: javascript jquery


【解决方案1】:

对于这种情况,CSS 有一个 selector

$(".item:nth-child(4n+1)").addClass('first');

如果都是兄弟姐妹,但又穿插了其他元素,则可以改用:nth-of-type

如果他们不是兄弟姐妹,没有选择器会帮助你。

【讨论】:

  • 这只有在 .item 元素是共同父元素的唯一子元素时才有效...
  • 太棒了!但是为什么是4n+1呢?
  • @LightStyle:因为 CSS 与 jQuery 不同,是从 1 开始的。 developer.mozilla.org/en-US/docs/Web/CSS/:nth-child
  • 非常感谢您的解释!我不知道!
  • If they are not siblings, no selector will help you. - 为什么解决方案需要 one 选择器,仅此而已?您可以轻松过滤,或者至少首先“缓存”.item 元素,使其比 OP 更高效
【解决方案2】:

如果元素都有一个父元素,并且父元素没有其他子元素,则可以使用nth-child。如果不是这种情况,情况会更复杂一些。这样的事情可能会奏效:

$('.item').filter(function(idx) {
    return idx % 4 === 0;
}).addClass('first');

一个稍微快一点的解决方案,虽然不太直观,但直接使用addClass

$('.item').addClass(function(idx) {
    return idx % 4 === 0 ? 'first' : '';
});

【讨论】:

    【解决方案3】:

    我喜欢 SLaks 的回答。不过,你也可以在 JS 中创建循环:

    var i = 0;
    var itemArray = $('.item');
    var lastNumber = itemArray.length;
    while(i <= lastNumber) {
        itemArray[i].className += ' first';
        i += 4;
    }
    

    【讨论】:

    • 仅仅因为你可以并不意味着你应该。
    • 我的回答真的那么可怕吗?它可能比使用 jQuery 函数循环更快。
    • @MarcMarta 试试看。它会慢得多,因为它必须创建 jQuery 对象并选择lastNumber/4 次。 jQuery 的循环相当高效。
    • 是的,我注意到了。现在检查答案。 jQuery 的循环永远不会像你在本地编写代码那样高效——它必须创建一个函数并运行它。
    • @RokoCBuljan 是的。当我开始写这个以实现更快的循环时,我实际上是在考虑向后循环。你说得对,我会修改的。
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多