原版javascript中的jQuery index()

IT技术 javascript jquery
2021-02-27 18:22:47

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

<ul>
  <li id="foo">foo</li>
  <li id="bar">bar</li>
  <li id="baz">baz</li>
</ul>

.index() 将返回匹配元素集合中第一个元素相对于其兄弟元素的位置:

alert('Index: ' + $('#bar').index();

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

Index: 1

我只想知道,我们如何使用JavaScript做同样的事情??

5个回答

您可以构建自己的函数:

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;
}

演示(打开控制台)

为什么不使用 parentNode.children 而不是 parentNode.childNodes?它可以允许使用 indexOf 而不是手动增加 num 。
2021-04-17 18:22:47
真的很喜欢这个答案!为什么需要以 结束return -1代码永远不会命中。如果传递无效元素,则会出现错误。
2021-04-18 18:22:47
这非常有帮助。谢谢!
2021-04-24 18:22:47
@Jessicaindex函数的通常约定是在-1找不到元素时返回,而不是错误(或者undefined没有最后一行时)
2021-04-30 18:22:47
谢谢!你知道 jquery 的来源index()是什么吗?
2021-05-05 18:22:47

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

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

经典方式:

function getNodeindex( elm ){ 
    var c = elm.parentNode.children, 
        i = c.length;
        
    while(i--) 
      if( c[i] == elm ) 
        return i
}

使用 ES2015:

const getNodeindex = elm => [...elm.parentNode.children].findIndex(c => c == elm)

// or

const getNodeindex = elm => [...elm.parentNode.children].indexOf(elm)

演示:

const getNodeindex = elm => [...elm.parentNode.children].indexOf(elm)
<button onclick="console.log(  getNodeindex(this)  )">get index</button>
<button onclick="console.log(  getNodeindex(this)  )">get index</button>
<button onclick="console.log(  getNodeindex(this)  )">get index</button>


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

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

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

[].indexOf.call(element.parentElement.children, element);
// => 2

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

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

[].indexOf.call(list, element);
// => 2

您可以通过使用 previousElementSibling 和递增在 dom 树中查找此信息。

var getElementIndex(element) {
    if (!element) {
        return -1;
    }
    var currentElement = element,
        index = 0;

    while(currentElement.previousElementSibling) {
        index++;
        currentElement = currentElement.previousElementSibling;
    }
    return index
}

getElementIndex(document.getElementById('#bar'));

这是对 previousElementSibling 的浏览器支持:

https://developer.mozilla.org/en-US/docs/Web/API/NonDocumentTypeChildNode/previousElementSibling

可以通过这种方式找到索引

    Array.from(children).findIndex(element => element.id === "bar")