【问题标题】:Javascript querySelectorAll, how to match with only top elements?Javascript querySelectorAll,如何只匹配顶级元素?
【发布时间】:2015-03-07 06:25:14
【问题描述】:

我正在使用聚合物。

假设我在模板中有如下内容

<ul>    
    <li>
        Home
    </li>
    <li>
        About
    </li>
    <li>
        Actions
        <ul>
            <li>
                Logout
            </li>
        </ul>
    </li>       
</ul>

在就绪功能中

var listNodes = this.querySelectorAll('ul > li');

我需要有关此 javascript 查询选择器的帮助。我应用的当前查询为我提供了该模板中所有 ulli。但我只想要顶部 ulli。我不想要模板的所有子 li。 我认为将其更改为正确的查询,我可能会得到正确的结果。请指导。谢谢。

【问题讨论】:

  • 给定代码的预期输出是什么?
  • 输出将是3个三里的节点。
  • @Mohit 感谢 susing [].filter.call(tabs.querySelectorAll(":scope > my-tab") 我能够获取有关父选择器的其他问题的详细信息。谢谢跨度>
  • document.querySelector("ul").children ...通过使用querySelector(),您只需选择页面上的第一个ul。然后.children 会直接在其下方为您提供li 元素。
  • @VivekMuthal filter 的用法不好,你应该使用 forEach,因为你实际上并没有过滤任何东西

标签: javascript jquery html polymer selectors-api


【解决方案1】:

使用 Mohit 的评论。能够找出答案。

var listNodes = this.querySelectorAll('ul:scope > li');

【讨论】:

【解决方案2】:

手动解决方案并不是那么糟糕,只需找到第一个列表,然后遍历其子元素:

var topList = document.querySelector('ul');

[].forEach.call(topList.children, function(el) {
  console.log(el);
});

Demo

如果列表有一个可识别的父元素(例如 body 或具有 id 的元素),您可以使用直接后代运算符 (&gt;)。

更新

由于您的问题被标记为,这里有另一个解决方案:

$('ul:first > li').each(function() {
  console.log(this);
});

【讨论】:

    【解决方案3】:

    你必须对李有所了解。如果它在文档的顶层,请使用body &gt; ul &gt; li

    console.log(document.querySelectorAll('body &gt; ul &gt; li'))
    <ul>    
        <li>
            Home
        </li>
        <li>
            About
        </li>
        <li>
            Actions
            <ul>
                <li>
                    Logout
                </li>
            </ul>
        </li>       
    </ul>

    否则,你必须有办法唯一标识ul的父级

    console.log(document.querySelectorAll('#user-content &gt; ul &gt; li'))
    <div id="user-content">
    <ul>    
        <li>
            Home
        </li>
        <li>
            About
        </li>
        <li>
            Actions
            <ul>
                <li>
                    Logout
                </li>
            </ul>
        </li>       
    </ul>
    </div>

    【讨论】:

      【解决方案4】:

      ul &gt; li 检查所有将li 作为直接子级的ul 元素。这就是为什么你会得到所有ulli

      如果你想限制在顶层 ulli 单独元素。然后为此使用ul标签的直接parent

         document.querySelectorAll('body > ul > li')
      

      假设bodyul 的直接父级。如果您有一个包装器 div / 任何其他具有类或 ID 的元素,也可以使用它来代替 body。

      【讨论】:

        【解决方案5】:

        像这样对顶部元素应用 id 或一些独特的选择器:

        <ul id="top">    
            <li>
                Home
            </li>
            <li>
                About
            </li>
            <li>
                Actions
                <ul>
                    <li>
                        Logout
                    </li>
                </ul>
            </li>       
        </ul>
        

        将允许您像这样获得顶级元素:

        var topElems = document.querySelectorAll("#top > li");
        

        您可以使用其他独特的选择器,例如 body &gt; ul &gt; li,但想法是您必须唯一标识要搜索的顶级 ul 元素。

        编辑

        如果它位于聚合物模板中,您可以执行类似template &gt; ul &gt; li 的操作。

        【讨论】:

        • 不,我不能使用聚合物添加 ID,模板将由用户提供。
        • 抱歉没用。
        • template 更改为content 是否可以解决任何问题?您能否发布您的聚合物元素或至少其中一些是html,以便我可以帮助诊断这个具体案例?
        • &lt;ul&gt; 是否保证是 light DOM 中的第一个元素?
        • 谢谢,但可以使用查询选择器中的 :scope 解决。
        猜你喜欢
        • 2013-06-26
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        相关资源
        最近更新 更多