【问题标题】:how to using "For" instead of "each" function in jquery如何在 jquery 中使用“For”而不是“each”函数
【发布时间】:2011-03-05 16:36:00
【问题描述】:

今天我非常喜欢 Work 和 jQ。我得到了一个早晨,但我无法解决它:(。 我在这里的工作:

<div class="container">
    <p class="test">a</p>
    <div>
        <p class="test">a</p>
    </div>
</div>

在正常情况下,我可以将 jQ 与每个功能 for 全选 &lt;p class="test"&gt;a&lt;/p&gt; EX:

$(".test").each(function() {
    $(this).text('a');
});

但我听到每个人都说,for 函数比each 函数获得的时间负载更少。现在我想使用for 而不是each.. 但在这种情况下我不知道如何编写代码jQ。

有人可以帮助我!谢谢!

【问题讨论】:

  • 为什么要减少时间负载?这是一个非常耗时的操作吗? javascript 的规则是,如果它没有滞后,并且没有过多的错误,那么它就是好的代码。

标签: javascript jquery iteration


【解决方案1】:

另一种选择:

for (var i = 0; i < $('.test').length; i++){
    var element = $('.test').eq(i);
}

【讨论】:

    【解决方案2】:

    除非您遍历数百个,否则我不会担心。

    for 循环通常用于普通的 DOM(也就是没有 jQuery)遍历,比如...

    var elements = document.getElementById('something').getElementsByTagName('a');
    
    var elementsLength = elements.length;
    
    for (var i = 0; i < elementsLength; i++) {
    
        elements[i].style.color = 'red';
    }
    

    缓存elementsLength 是个好主意,因此不会在每次迭代时都计算它。感谢 CMS 在 cmets 中的建议。

    如果你想用 jQuery 来做,只需为你的 jQuery 对象调整它。

    用您的 jQuery 集合替换 elements 变量,例如 $('#something a')。如果你需要用它做更多的 jQuery 东西,我认为你可能需要重新包装对象。

    【讨论】:

    • 上次我检查getElementById返回了一个html元素,它没有像getElementsByTagName这样的方法。那只是文件所具有的。长话短说,我认为不可能将这样的方法与原生 javascript 方法链接起来
    • 他的代码是正确的。您可以使用任何 DOM 元素作为上下文来使用 getElementsByTagName 或 getElementsByClassName 这样的方法。
    • @alex: 你的循环条件应该是i &lt; elements.length 因为elements[elements.length] 将是undefined(它们是基于0的)否则你会在最后一次迭代中得到一个TypeError , 同样在使用 HTMLCollections 时缓存 length 属性的值是一个好主意,因为在每次迭代中访问该值是昂贵的,因为 HTMLCollections 是 "live"。例如。 for(var i = 0, n = elements.length; i &lt; n; i++)
    • 是的,所有人的回答都是正确的。我认为每个代码都是相似的。这也是正确的代码:)。谢谢大家:)
    • @CMS 我知道缓存长度是个好主意,但不确定添加它是否会影响最重要的事情——实际遍历。尽管如此,我还是把它包括在内:)
    【解决方案3】:

    This article 表明 each() 没有显着的性能损失,直到您进入数十万个循环项目。

    【讨论】:

    • 这是值得称赞的,但这会以降低代码清晰度和可维护性为代价获得微不足道的性能提升。我敢打赌,其他地方会有更大的性能猪。就像Something.lengthfor 循环中一样? ;-)
    【解决方案4】:

    需要注意的一点是,在 jQuery 选择的结果上使用序数访问器将返回本机 DomElement。如果你想对它们使用 jQuery 方法,你必须重新包装它们:

    var testElements = $('.test');
    
    for (var i = 0; i < testElements.length; i++) {
      // Using $() to re-wrap the element.
      $(testElements[i]).text('a');
    }
    

    不过,我会赞同其他人所说的话。除非您要处理许多元素,否则这是过早的优化。重新包装元素以使用 .text() 方法甚至可能完全没有收益。

    【讨论】:

    • +1 表示“重新包装元素以使用 .text() 方法甚至可能完全没有收益。”。我没有任何基准,但是重新包装每次迭代听起来很麻烦。
    • 重新包装是循环中的$(element) 步骤。如果您仍然希望能够在每个元素上使用 jQuery 的方法,这是必要的,但是每次迭代都会以性能为代价(因为 jQuery 会构造一个新的 jQuery 对象来包装该元素及其扩展功能)。
    【解决方案5】:

    您是否尝试过显而易见的解决方案?

    var nodes = $(".test");
    for(var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
    }
    

    【讨论】:

    • for 块不是闭包,因此从技术上讲,您将在每个循环上重新定义相同的变量。不确定,但我认为这会引发错误。
    • 变量声明被“提升”到顶部,所以它实际上是这样的:var nodes, node; nodes = $('.test'); for (...) { node = nodes[i]; }
    • 我为什么要引用相同的元素。节点是一个 html 元素的数组。此集合中的第 i 个元素是找到的具有类 test 的元素之一。我在这里没有看到问题
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多