你对什么有根本性的误解
variableName = $("selector here");
做。它不“存储选择器”。它运行您提供的选择器currentDOM 中的元素,创建一个 jQuery 对象,将匹配的元素放入 jQuery 对象中,并为您提供对该 jQuery 对象的引用。不存储选择器(以 jQuery 内部为模)。
所以给出:
<body>
<div class="foo">x</div>
</body>
Then:
var $divs = $("div.foo");
console.log($divs.length); // 1
给我们这个:
如果我们再添加另一个匹配div
:
$('<div class="foo"></div>').appendTo(document.body);
Our $divs
仍然只指向第一个;添加另一个匹配元素到 DOM 对引用的 jQuery 对象没有影响$divs
.
如果我们此时重新运行查询:
$divs = $("div.foo");
...然后我们有:
如果您有一个包含 DOM 元素的 jQuery 对象,并且您添加后裔元素到该 DOM 元素,然后使用该 jQuery 对象(例如).find
将会见到子孙。这是因为父 DOM 元素已经存在于 jQuery 对象中。例如,添加一个span
到其中之一div
是我们already来自我们的 jQuery 对象的引用:
如果我们要使用.find
on $divs
那时正在寻找一个span
,我们会找到它,因为它是我们已经引用过的元素之一的后代。
如果你想稍后重新运行 DOM 搜索来查找匹配的元素,你只需使用$()
再次;这在上面是隐含的,但为了清楚起见:
var $divs = $("div.foo");
console.log($divs.length); // 1
$('<div class="foo"></div>').appendTo(document.body);
console.log($divs.length); // Still 1
$divs = $("div.foo");
console.log($divs.length); // Now it's 2
因此,在需要时“存储选择器”就是将选择器字符串存储在某处,而不是 jQuery 对象。