jQuery是否像LINQ一样延迟执行?

4

我想知道,如果我把一个变量设置为一个 jQuery 查询,它会立即执行还是延迟到控制流首次尝试访问其结果元素时(比如对其进行迭代)?

换句话说:一个变量是存储查询本身还是存储结果呢?

例如:

var $query = $('myselector'); // Is it traverses the DOM this time or later when actually using this variable?
2个回答

4

查询立即执行,并将结果存储在jQuery对象中。jQuery对象是一个类似数组的对象,包含对找到的元素的引用。

如果您稍后添加了另一个应包括在选择器中的元素,则jQuery对象中的结果不会更改。它仍然只包含在执行查询时找到的元素。

相比之下,像getElementsByName这样的一些DOM方法返回一个动态的NodeList集合,如果您添加或删除与名称匹配的元素,该集合会发生变化。


谢谢。这是来自规范,因此不会改变,还是仅通过检查源代码而来,在未来的实现中可能会根据实现者的意图而改变? - g.pickardou
@g.pickardou:我现在找不到具体规定,但这是jQuery工作的基本部分,因此它将来不会改变。jQuery对象是一个类似数组的对象,其中包含查询结果。 - Guffa

0

jQuery不是LINQ。当您调用$('myselector')时,它会被转换为对document.querySelectorAll的调用,该函数返回一个节点列表。没有延迟加载。该列表也不是“实时”的。它代表了DOM在那个时间点的状态。因此,如果您更改它(添加节点、删除节点),则您的列表不会被修改。它代表了选择器被调用时DOM的状态。Mozilla在MDN 这里上有很好的解释。

另外需要注意的是,除了调用document.querySelectorAll之外,有时候jQuery必须使用Sizzle引擎自己处理选择器。当您使用某些扩展而这些扩展不是querySelectorAll支持的一部分,或者您正在使用不具备此功能的浏览器时,就会发生这种情况。其中一个例子是:eq(N)伪类。这不是querySelectorAll的一部分,因此jQuery会完成所有繁重的工作。请注意,即使所有工作都由Sizzle完成,它仍然会立即执行并返回与选择器匹配的非实时节点列表。


注意:在不支持 querySelectorAll 的浏览器中,或者如果查询包含 jQuery 特定的选择器,则将使用 Sizzle 查询引擎。 - Guffa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接