使用jQuery选择器重复检查的效率

时间:2014-05-01 21:27:48

标签: javascript jquery

jQuery是否缓存选择器查找?

我想知道这段代码是否

if ($("#ItemID").length) {
     doSomethingWith($("#ItemID"));
}

将明显慢于此代码

item = $("#ItemID");
if (item.length) {
    doSomethingWith(item);
}

如果您要提取更多的DOM,例如$("div")而不仅仅是$("#ItemID"),那该怎么办?同样的答案?

外部参考/解释会有所帮助,而不仅仅是意见。

2 个答案:

答案 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"元素,然后我保存的选择将缺少新元素并包含对已删除元素的引用。