【问题标题】:Iterate over a jQuery collection without having to rebuild the jQuery object无需重建 jQuery 对象即可遍历 jQuery 集合
【发布时间】:2013-03-19 07:23:13
【问题描述】:
$(".item").each (i, elt) ->
    $(elt).attr("href")
    # ...

执行$(elt) 是获取jquery 对象的必要条件。有没有一种方法可以遍历一个 jquery 集合,而不必重建 jquery 对象?

【问题讨论】:

  • 如果您只是在href 属性之后,为什么不使用elt.href
  • 因为这是一个完全随机的例子,所以我需要 jquery 对象。
  • 首先你没有每个元素的 jQuery 对象。当您使用$(".item") 时,它基本上会创建一个DOM 元素数组。所以你不是在重建一个 jQuery 对象。您有一个包含所有元素的主要 jQuery 对象。当您需要访问一个时,如果您想要 jQuery 方法,则必须将其包装为 jQuery 对象

标签: javascript jquery iterator


【解决方案1】:

$(elt) 是获取 jquery 对象的必要条件。

是的。

有没有一种方法可以遍历一个 jquery 集合,而不必重建 jquery 对象?

没有。因为您拥有的 jQuery 对象是所有匹配元素的集合。要在单个元素上使用 jQuery 方法,您需要获取一个 jQuery 对象,该对象仅包含您要操作的单个元素。在一个循环中,这意味着包装你的elt(或this,因为两者都是同一个DOM元素)。

但是,对于很多事情,您并不需要 jQuery 方法。你的例子就是其中之一,直接使用elt.href

$(".item").each (i, elt) ->
    var someVar = elt.href;
    # ...

DOM2 HTML spec 和较新的HTML5 spec 都列出了许多可以直接使用的反射属性。例如,id 是人们经常使用的一种。你看到$(this).attr("id") 很多地方this.id 就足够了(而且效率更高,尽管效率非常重要)。

【讨论】:

  • 是的,但我的意思是 jQuery 可能选择将实际的 jQuery 对象传递给回调。
  • @Robin:是的,他们本可以——但他们没有,可能是因为这意味着创建很多人们不一定会使用的 jQuery 对象,从而导致不必要的内存流失。这样,人们可以根据需要创建(或不创建)对象。
  • @Robin 它必须先做一个
  • 仅 DOM2 规范链接似乎非常有用。书签,谢谢。
  • @JanDvorak:我的标准参考链接列表的一部分,毫无疑问。还有 DOM2 Core、DOM3 Core、事件规范等。都可以在这里找到:w3.org/DOM/DOMTR
【解决方案2】:

是的,缓存 jQuery 对象然后按索引选择。

var $items = $(".item");

$items.each(function(i) {
    $items.eq(i).doStuff();
});

【讨论】:

  • 请注意,这也会产生 jQuery 对象,尽管方式不同。 eq 不会(也不能)缓存它的返回值。
猜你喜欢
  • 2012-04-19
  • 2017-06-23
  • 1970-01-01
  • 2014-10-02
  • 2014-11-30
  • 2015-11-24
  • 2011-04-10
  • 1970-01-01
  • 2010-12-26
相关资源
最近更新 更多