$("div p") 等同于 $("div*p") 吗?

Is $("div p") equivalent to $("div*p")?

星号运算符似乎递归所有选定的子项,这与 space 发生的事情相同。我觉得很奇怪 space 就像一个运算符,但 $("div p")$("div*p").

做同样的事情

不,这不等同。星号运算符意味着,至少有一个元素需要位于它们之间。等效的选择器表达式是

p * div, p > div

匹配两种情况。 Selectors level 4 很可能会引入另一个运算符

p >> div

确实等同于p<space>div

对于 jQuery 部分:如果您编写 $('p div') 或任何其他选择器,您将熟悉 HTML 中的自动关闭元素。在这种特定情况下:div 元素不能位于 p 元素内。浏览器会在遇到div时自动关闭p。如果您以此开头:

<p>
    <div></div>
</p>

您的 DOM 将如下所示:

<p></p>
<div></div>
<p></p>

因此永远不会匹配 p divp * div 中的任何一个...请参阅此 JSFiddle(注意:将两次执行 alert())。

编辑: 正如@Bharadwaj 在评论中指出的那样,p*div 的符号是错误的,永远不会匹配。原因是,* 是一个 placeholder for an element name,因此必须用空格包围。

在此HTML:

<div>
  <p>Paragraph 1</p>
  <div>
    <p>Paragraph 2</p>
  </div>
</div>

div p 选择两个段落,这意味着 p 元素位于 div.
中的任何位置 div * p 只是嵌套的,因为 * 代表任何元素(所以 p 里面的任何元素里面 div

http://jsfiddle.net/21ru2x5c/

顺便说一句 p div 不应该匹配任何东西,因为你不能在段落中有块级元素。浏览器在解析 DOM 时在打开块级元素之前关闭 <p> 元素:http://jsfiddle.net/21ru2x5c/1/