【问题标题】:jQuery eq() caused infinite iterationjQuery eq() 导致无限迭代
【发布时间】:2016-09-06 01:11:17
【问题描述】:

当我试图在我的代码中总结事情时,我发现当我写这样的东西时:

var $elements = $('div');
for ( var i = 0, $element; $element = $elements.eq(i); i++ ) {
    $element.text( 'Hello' );
}

循环永远不会结束。我想知道,为什么会这样。如果我在条件内调用函数会导致错误,或者 jQuery 只是没有返回准确的数据,因此循环条件无法识别当前索引?

【问题讨论】:

  • i 声明中,您还可以将 $element 重新分配给 i
  • $elements.eq(i) 是什么意思?它的输出应该是什么?
  • $element = $elements.eq(i) 应该返回包装在 jQuery 对象中的集合中的 ith 元素。我很确定 OP 希望在没有 ith 元素后会失败。
  • 我的输出应该是每个 div 元素的 jQuery 对象。我试图避免在循环内分配变量,而不是在条件中。当然我可以只遍历元素数组,但是我仍然必须创建一个 jQuery 对象来访问 jQuery 方法。
  • 你为什么要重新发明 jQuery 的每个?

标签: javascript jquery loops iteration


【解决方案1】:

.eq() 方法总是返回一个 jQuery 对象。如果你指定一个不存在的索引,你会得到一个空的 jQuery 对象。但是任何对象都是真实的,所以即使在i 超过最后一个元素之后,你的循环条件也总是真实的。所以,无限循环。

你需要测试长度:

for ( var i = 0, $element; i < $elements.length && ($element = $elements.eq(i)) ; i++ )

但为什么不直接使用.each() 方法循环呢?

将当前元素分配为循环条件的模式确实适用于数组:

for ( var i = 0, element; element = anArray[i]; i++ ) 

假设所有元素都没有错误值,因为当i 达到an array.length 时,anArray[i] 将是undefined,这是错误的。

【讨论】:

  • 分配的左侧无效 i &lt; $elements.length &amp;&amp; $element = $elements.eq(i) 看起来无效。
  • @kindisch - 哎呀。我已经添加了括号。并建议改用.each()
  • 我喜欢尽可能少地使用 jQuery,因为它会减慢速度。你会说,.each() 在这种情况下会更快吗?对于.each(),我仍然必须分配 jQuery 对象。
  • 谢谢你们俩。 nnnnnnMike C. 我有点挣扎应该奖励谁,但我最终选择了 nnnnnn,因为他把樱桃放在蛋糕上他的示例如何在条件内正确使用 jQuery .eq()
  • .each() 比普通的 for 循环慢,但慢多少取决于你在循环中做什么。在大多数“正常”情况下,用户不会注意到差异。我假设您的真实代码所做的不仅仅是为每个元素分配相同的文本(因为如果这就是您想要做的所有事情,您可以在一行中使用$elements.text("hello")),但有时在 .each() 循环中您不这样做'不需要单个元素作为 jQuery 对象,您可以直接访问 this.value 或其他一些属性。
【解决方案2】:

因为$$elements.eq 将始终返回一个对象,即使没有与查询匹配。该对象的长度为 0,但它仍然是一个对象。对象是真实的值。

function log(msg) {
  document.querySelector('pre').innerText += msg + '\n';
}

log($('p').eq(0)); // First p element
log($('p').eq(1)); // Second p element
log($('p').eq(2)); // Third p element
log($('p').eq(3)); // No matching p element but look at what we get

if ($('p').eq(9001)) {
  log('Yup, still a truthy value');
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>1</p>
<p>2</p>
<p>3</p>

<pre></pre>

【讨论】:

  • 谢谢你们俩。 nnnnnnMike C. 我有点挣扎应该奖励谁,但我最终选择了 nnnnnn,因为他把樱桃放在蛋糕上他的示例如何在条件内正确使用 jQuery .eq()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2013-02-10
  • 2021-10-08
相关资源
最近更新 更多