4

我知道 jQuery 不缓存元素集合,f.ex 调用:

$('.myclass').html('hello');
$('.myclass').html('bye');

会让 jQuery 爬上 DOM 两次。

但是缓存的 DOM 节点呢?

var elems = document.querySelectorAll('.myclass');

$(elems).html('hello');
$(elems).html('bye');

jQuery 会在内部缓存这些内容,还是会像第一个示例一样慢?

澄清一下:jQuery 是否会在内部保留对的引用elems和缓存$(elems),这样就不必$()每次都应用相同的包装器?

就像是:

cache = {}
constructor = function(collection)
    if collection in cache
        return cache[collection]
    else construct(collection)
4

2 回答 2

12

假设我已经正确理解了您的问题,那么不,jQuery 不会在使用它们的语句之外保留对选定节点的引用:

$('.myclass').html('hello'); //Select all .myclass elements, then change their HTML
$('.myclass').html('bye'); //Select all .myclass elements, then change their HTML again

如果您单独维护对这些选定节点的引用,它会更快:

var elems = document.querySelectorAll('.myclass'); //Select all .myclass elements
$(elems).html('hello'); //Change their HTML (no need to select them)
$(elems).html('bye'); //Change their HTML (no need to select them)

差异不会很大(除非您的 DOM 非常复杂),但会有差异

在此处输入图像描述


更新

jQuery 是否会保留对 elems 的引用并在内部缓存 $(elems) 以便不必每次都应用相同的 $() 包装器?

不,不会的。如上所述,对匹配的元素集的引用将不会保留在其适用的语句之外。您可以通过保留对始终使用的 jQuery 对象的引用来提高代码的性能,而不是每次都重新选择它们,甚至每次都将一组存储的本地 DOM 节点包装在一个 jQuery 对象中。

于 2012-09-05T07:55:38.530 回答
0

如果“缓存”的意思是“将 DOM 元素保留在该jQuery 对象的内部集合中”......那么是的。

想象

jq = $(elementListOrSelector)

其中jq[0..jq.length-1]计算分别为 DOM 元素。例如,jq[0]计算 jQuery 对象表示的第一个 DOM 元素(如果有)。请注意,此集合在构建后不会神奇地更改(构建方式无关紧要)。

然而,除了简单地保留该特定jQuery 对象的即时结果之外,没有“缓存” 。

于 2012-09-05T07:54:02.120 回答