在vanilla javascript中的jQuery index()

pal*_*aѕн 26 javascript jquery

根据jQuery api,接受索引并返回DOM节点的.get()的补充操作.index()可以获取DOM节点并返回索引.假设我们在页面上有一个简单的无序列表:

<ul>
  <li id="foo">foo</li>
  <li id="bar">bar</li>
  <li id="baz">baz</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

.index() 将返回与其兄弟姐妹相关的匹配元素集中第一个元素的位置:

alert('Index: ' + $('#bar').index();
Run Code Online (Sandbox Code Playgroud)

我们回到列表项的从零开始的位置:

Index: 1
Run Code Online (Sandbox Code Playgroud)

我只是想知道,我们怎么能用JavaScript做同样的事情?

Den*_*ret 19

您可以构建自己的功能:

function indexInParent(node) {
    var children = node.parentNode.childNodes;
    var num = 0;
    for (var i=0; i<children.length; i++) {
         if (children[i]==node) return num;
         if (children[i].nodeType==1) num++;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

演示(打开控制台)


vsy*_*ync 11

我已经修改了Travis J的答案,不包括TextNodes并从中创建了一个函数.

您可以在控制台中运行它并查看(在stackoverflow上).

经典方式:

function getNodeindex( elm ){ 
    var c = elm.parentNode.children, i = 0;
    for(; i < c.length; i++ )
        if( c[i] == elm ) return i;
}

// try it
var el = document.getElementById("sidebar");
getNodeindex(el);
Run Code Online (Sandbox Code Playgroud)

使用ES2015:

function getNodeindex( elm ){ 
    return [...elm.parentNode.children].findIndex(c => c == elm)
    // or
    return [...elm.parentNode.children].indexOf(elm)
}
Run Code Online (Sandbox Code Playgroud)

我还想指出另一个关于同一问题的线程,它有一个很好的答案(对于寻求旧IE支持的人)


fre*_*nte 5

无回路需要,调用Array#indexOf.parentElement.children

const element = document.querySelector('#baz');

[].indexOf.call(element.parentElement.children, element);
// => 2
Run Code Online (Sandbox Code Playgroud)

你甚至可以在随机的元素列表上调用它,就像在 jQuery 中一样:

const list = document.querySelectorAll('li');
const element = document.querySelector('#baz');

[].indexOf.call(list, element);
// => 2
Run Code Online (Sandbox Code Playgroud)

  • 这应该得到更高的支持,它完成了与所有其他答案在一行代码中完成的相同的事情 - 太棒了 (2认同)