【问题标题】:jquery selector confusion - $('div p') vs $('div>p')jquery 选择器混淆 - $('div p') vs $('div>p')
【发布时间】:2013-04-07 23:58:47
【问题描述】:

我正在尝试学习 jquery 并有一个问题 -

页面上的 div 元素看起来像 -

<div id ="1">
    <p id="first"> one 
        <p id="second"> one.one 
            <p id="third"> one.one.one </p>
        </p>
    </p>
</div>

以下两个选择器都给了我相同的结果 -

  $('div p').css({'background-color' : 'blue'}); 

  $('div>p').css({'background-color' : 'blue'});

第二个选择器不应该只返回&lt;div&gt;元素的第一个&lt;p&gt;标签吗?

【问题讨论】:

标签: jquery jquery-selectors


【解决方案1】:

$('div p') 选择 all &lt;p&gt; 标记是&lt;div&gt; 的后代。

$('div&gt;p') only 选择作为&lt;div&gt; 的直接子代的&lt;p&gt; 标签。


您的代码中发生的情况是,由于结束 &lt;/p&gt; 标记是可选的,浏览器正在读取您的 HTML,因为它有 3 个 &lt;p&gt;(实际上是 5 个,因为最后 2 个结束标记是“误读”)标签都是兄弟姐妹。

所以,它被解读为:

<div id ="1">
    <p id="first"> one</p> 
    <p id="second"> one.one</p>
    <p id="third"> one.one.one</p>
    <p></p>
    <p></p>
</div>

这就是为什么他们都变成了蓝色。 $('div&gt;p') 匹配它们,因为它们都是 &lt;div&gt; 的直接子代(或者浏览器是这样认为的)。

演示:http://jsfiddle.net/wP7uD/

打开浏览器的开发工具并检查 DOM,你会看到有 5 个&lt;p&gt; 标签。

寓意:您不能将&lt;p&gt; 标签作为&lt;p&gt; 标签的子标签。


&lt;p&gt; 标签的 W3C 规范:http://www.w3.org/TR/html-markup/p.html

【讨论】:

  • +1 因为其他人都在解释&gt; 做了什么(OP 似乎已经理解了),而不是为什么他们得到这个结果。
  • @FelixKling:在 OP 的问题中,他说他希望 $('div&gt;p') 只返回第一个元素。如果不是因为&lt;p&gt; 标签很奇怪,他会是对的。另外,我通常是这样回答的;解释 为什么 OP 得到他的结果。 :-D
【解决方案2】:

所有&lt;p&gt; 都是第一个&lt;p&gt; 元素的子元素。

【讨论】:

  • 不幸的是,他们不是。 &lt;/p&gt;s 是可选的,所以他的代码读作&lt;div&gt;&lt;p&gt;one&lt;/p&gt;&lt;p&gt;one.one&lt;/p&gt;...&lt;p&gt; 标签不能是 &lt;p&gt; 标签的子标签。 w3.org/TR/html-markup/p.html#p-tags
  • @RocketHazmat 无效?是的。 OP引用了什么?是的。
【解决方案3】:

【讨论】:

  • 我似乎 OP 了解其中的区别,但不明白为什么他会得到他得到的结果。
【解决方案4】:

div &gt; p 表示div 的第一级p 子级。和div p 暗示p 的孩子divdiv 的后代中的任何地方

更多documentation here

【讨论】:

    【解决方案5】:
    div p
    

    匹配div内的所有p元素,无论它们有多深。

    div > p
    

    匹配所有p 元素div 的直接子元素

    您的问题是 HTML。 不允许将p 嵌套在另一个p 中;浏览器会自动关闭第一个 p,然后再呈现新的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多