代码之家  ›  专栏  ›  技术社区  ›  Mark Schultheiss

jQuery选择器不是我所期望的

  •  0
  • Mark Schultheiss  · 技术社区  · 15 年前

    鉴于以下结构:

    <div id='something'>something</div>
    <div id='parental'>
        <div><p>hi there</p> goats</div>
        <p>hello again</p>
    </div>
    <div> end of the line</div>
    

    var Fred= $('#parental');
    $('div').css({color: 'blue'});
    Fred.children('div').css({color: 'red'});
    Fred.children('div').children('p').css({color:'green',border:'solid red 2px'});
    Fred.children('div p').css({color: 'orange'});
    Fred.children('div>p').css({border:'solid #FFFF00 2px'});
    
    • “某物”和“行尾”是蓝色的,正如我所料
    • “山羊”像我预料的那样是红色的。
    • “hi there”为绿色,带红色边框(我预期为橙色/黄色边框)
    • “又来了你好”是带黄色边框的橙色(不是我预想的那样)。

    Fred.children('div p') 选择器和 Fred.children('div').children('p') Fred.children('div>p') 不选择相同的东西?

    在这里看到它的实际作用: http://jsfiddle.net/bxAzN/

    3 回复  |  直到 15 年前
        1
  •  2
  •   Felix Kling    15 年前

    因为 .children() 执行以下操作:

    去拿那个 匹配元素集合中的每个元素的,可选地由选择器过滤。

    div p . 唯一的孩子 #parental 是一个 div p 元素。 .children('div p') 元素,因为它有 作为祖先( 本身)。但是 部门
    你应该想想 children() 使所有子级都按此选择器筛选 这和 获取与此选择器匹配的所有子体 . 为此,你必须使用 find() .

    Fred.children('div').children('p') 部门 Fred 然后选择所有

        2
  •  2
  •   Thomas Clayson    15 年前

    children()等于在选择器中执行“>”。

    jquery网站上说。。。

    DOM树

    因此使用 children('div p') 不起作用,因为您正试图从DOM树向下查看两个阶段。使用 children('div>p') 确实有效,因为它实际上是一个选择器,尽管我知道为什么这让人困惑。

    find() .

        3
  •  1
  •   Pramendra Gupta    15 年前

    儿童 找到

    var Fred= $('#parental');
    $('div').css({
        color: 'blue'
    });
    Fred.children('div').css({
        color: 'red'
    });
    Fred.find('div').find('p').css({
        color: 'green',border:'solid red 2px'
    });
    Fred.find('div p').css({
        color: 'orange'});
    
    Fred.find('div>p').css({
        border:'solid #FFFF00 2px'
    });​
    

    http://jsfiddle.net/bxAzN/2/

    子节点只查看节点的直接子节点,而find遍历节点下的整个DOM,因此子节点会更快。使用哪一个取决于您是只想考虑DOM中的直接子代还是该子代之下的所有节点。-特凡福森

    children和find不一定给出相同的结果:find()将获得任何后代节点,而children()只获得匹配的直接子节点。

    因此,find()会比较慢,因为它必须搜索可能匹配的每个子节点,而不仅仅是直接的子节点。