给定以下无序列表,JQuery选择器$("#root #2")
选择:
/ul/li/ul[@id='root']/li/ul[@id='1']/li/ul[@id='2']
我希望它选择较短的路径:
/ul/li/ul[@id='root']/li/ul[@id='2']
任何想法?
<ul>
<li>root
<ul id="root">
<li>1
<ul id="1">
<li>2
<ul id="2"> <!--*selecting this*-->
<li>3<ul id="3"></ul></li>
<li>4<ul id="4"></ul></li>
</ul>
</li>
<li>3<ul id="3"></ul></li>
</ul>
<li>2
<ul id="2"> <!-- *expecting this* -->
<li>3
<ul id="3">
<li>4<ul id="4"></ul></li>
</ul>
</li>
</ul>
</li>
<li>3<ul id="3"></ul></li>
<li>4<ul id="4"></ul></li>
</ul>
</li>
</ul>
答案 0 :(得分:10)
行为可能未定义/未达到预期的两个原因:
答案 1 :(得分:2)
使用选择器中的空格选择任何祖先。我的预感是,由于id = 2的li位于DOM之前的id = 2的ul之前,jQuery会停止(因为id应该是唯一的)。
我希望这不是真正的HTML ...因为id应该是唯一的。
答案 2 :(得分:1)
您正在使用后代运算符,它将搜索所有后代。我想jQuery在搜索DOM树时使用深度优先搜索算法。这就解释了为什么你首先得到最长的。至于为什么jQuery只返回一个节点,你使用ID选择器,它应该在所有DOM节点中都是唯一的。我希望jQuery在第一场比赛后返回,因为遍历树的其余部分是没有意义的。
答案 3 :(得分:1)
此选择器应返回ID为2的任何元素,该元素是ID为root的任何元素的后代,以DOM顺序排列。我希望它能够返回你在问题中提到的两个元素。更深层次的将是第一个,因为它是文档中的第一个。
请注意,ID应该是唯一的。如果有两个ID为2的元素,则会出错。