jQuery是否缓存选择器查找?
我想知道这段代码是否
if ($("#ItemID").length) {
doSomethingWith($("#ItemID"));
}
将明显慢于此代码
item = $("#ItemID");
if (item.length) {
doSomethingWith(item);
}
如果您要提取更多的DOM,例如$("div")
而不仅仅是$("#ItemID")
,那该怎么办?同样的答案?
外部参考/解释会有所帮助,而不仅仅是意见。
答案 0 :(得分:1)
这个
var item = $("#ItemID");
if (item.length) {
doSomethingWith(item);
}
会更快但很少。 doSomethingWith将转到存储对象的指针 结果是people do cache selectors btw
答案 1 :(得分:1)
根据jQuery Learning Center," jQuery不会为您缓存元素。如果您已经做出了可能需要重新制作的选择,则应将选择保存在变量中,而不是重复进行选择。"
当你的选择器本质上很慢时,这一点尤为重要。例如,$("#foo")
在document.getElementById()
的封面下进行调用,这应该非常快。但是,像$("a[rel$='thinger']")
这样的选择器在较旧的浏览器上可能会慢得多。
请记住,jQuery支持链接,因此您不必总是引入变量来保存选择,您可以将顺序调用链接在一起。例如,在此代码中,我不会仅仅为了保存.find("img")
的结果而引入变量,而是将三个调用链接到prop,一个链接显示。
clusterBlock.find("img").prop("src", clusterElt.imageUri)
.prop("alt", clusterElt.description)
.prop("id", clusterElt.imageId)
.show();
最后,请记住,随着DOM的更改,保存的选择不会更新。如果我通过课程获得所有元素" foo"并将其保存在变量中,然后其他一些代码添加并删除了几个" foo"元素,然后我保存的选择将缺少新元素并包含对已删除元素的引用。