jQuery 选择器令人困惑

jQuery selectors confusing

如果有人也指出我的理论来源,我将不胜感激,以便我更好地掌握它。

假设我有以下 HTML:

<ul>
  <li>1</li>
</ul>

<ul>
  <li>2</li>
</ul>

和这个 JavaScript 代码:

alert($("ul li:eq(0)").length);

alert($("ul").find("li:eq(0)").length);

alert($("ul").find("li").eq(0).length);

我得到 1,2,1 作为输出。我能理解为什么我在最后一个案例中得到 1 但为什么 JavaScript 代码的第 1 行和第 2 行给我不同的输出。

fiddle : https://jsfiddle.net/ishansoni22/pntz6kfx/

eq 是一个奇怪的 jQuery 选择器,与大多数选择器基于 CSS 的逻辑不太一致(在这个 documentation 摘录中强调我的):

The index-related selectors (:eq(), :lt(), :gt(), :even, :odd) filter the set of elements that have matched the expressions that precede them

总之,第一种情况下的eq(0)适用于整个 ul li.

$("anything :eq(0)")最多可以return一个元素。

而在第二种情况下,"li:eq(0)" 选择器由 find 应用于 $("ul") 的所有匹配项。

您可以通过以下 link 来更好地处理 :eq & .eq() https://forum.jquery.com/topic/eq-vs-eq

如果您仍然有疑问,这里可能是这个问题的重复: Difference between ":eq()" and .eq()

alert($("ul li:eq(0)").length); => ul 中第一个 li 的长度,:eq(0) 总是 returns 1 或 0 个元素。

alert($("ul").find("li:eq(0)").length); => li 在 ul 中退出的次数

alert($("ul").find("li").eq(0).length); => liul

内退出的次数长度