在不影响子项的情况下插入元素(限制jQuery的选择器深度)

时间:2015-04-14 12:27:25

标签: javascript jquery html dom

让我假装我有以下DOM结构:

<li role="treeitem" aria-selected="false" aria-level="2" aria-labelledby="3_anchor" aria-expanded="true" id="3" class="jstree-node  jstree-open">
    <div unselectable="on" role="presentation" class="jstree-wholerow">&nbsp;</div>
    <i class="jstree-icon jstree-ocl" role="presentation"></i>
    <a class="jstree-anchor" href="#" tabindex="-1" id="3_anchor">
        <i class="jstree-icon jstree-themeicon" role="presentation"></i>Hombre (3)
    </a>
    <ul role="group" class="jstree-children">
        <li role="treeitem" aria-selected="false" aria-level="3" aria-labelledby="10_anchor" id="10" class="jstree-node  jstree-leaf">
            <div unselectable="on" role="presentation" class="jstree-wholerow">&nbsp;</div>
            <i class="jstree-icon jstree-ocl" role="presentation"></i>
            <a class="jstree-anchor" href="#" tabindex="-1" id="10_anchor">
                <i class="jstree-icon jstree-themeicon" role="presentation"></i>Corbatas (10)
            </a>
        </li>
        <li role="treeitem" aria-selected="false" aria-level="3" aria-labelledby="9_anchor" id="9" class="jstree-node  jstree-leaf jstree-last">
            <div unselectable="on" role="presentation" class="jstree-wholerow">&nbsp;</div>
            <i class="jstree-icon jstree-ocl" role="presentation"></i>
            <a class="jstree-anchor" href="#" tabindex="-1" id="9_anchor">
                <i class="jstree-icon jstree-themeicon" role="presentation"></i>Sudaderas (9)
            </a>
        </li>
    </ul>
</li>

现在让我们说我想在最高a项的li元素之后插入一些内容(即a文本Hombre (3) })。

如果我使用

$("<i>").insertAfter('a', my_dom_element);

i元素将插入每个a元素中(总共3个),这是我想要阻止的。

如何强制jQuery在DOM中只搜索1级,而不是遍历所有元素?

我无法使用任何类来限制搜索,因为我不知道DOM将拥有哪些类。我正在寻找限制jQuery的DOM扫描级别

编辑:

我非常期待:http://bugs.jquery.com/ticket/9391

2 个答案:

答案 0 :(得分:3)

您可以使用属性aria-level将li定位为值为2.然后使用直接子选择器仅定位直接锚元素:

$("<i>").insertAfter('li[aria-level="2"] > a', my_dom_element);

更新:不使用类,ID,属性等。

$("<i>").insertAfter('a:first', my_dom_element);

$("<i>").insertAfter('a:eq(0)', my_dom_element);

答案 1 :(得分:2)

这个怎么样:

$( "<i>" ).insertAfter( "a:first" , my_dom_element);

<强>更新

对于两个标签,我认为你可以这样做:

$("<i>").insertAfter('a:eq(0),a:gt(0)', my_dom_element);