【问题标题】:jQuery index() in vanilla javascript原生 javascript 中的 jQuery index()
【发布时间】:2012-11-19 10:18:35
【问题描述】:

根据 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 做同样的事情?

【问题讨论】:

  • 我并不是建议你应该总是使用 jQuery,但出于好奇,你为什么要在纯 JS 中这样做?
  • @JamWaffles:我主要使用 jQuery,因为它具有“少写多做”的特性。所以,我问这个问题只是为了我的知识,让其他人知道,这个例子中“少写多做”的真正含义。希望你明白我的意思!
  • Finding DOM node index的可能重复
  • @AndrewWhitaker 应该注意的是,列出的重复项中的答案会查找索引而不测试节点的类型(例如可能是文本)。这就是为什么他们不返回与 jquery 的索引相同的结果(这是问题),这通常是有用的。

标签: javascript jquery


【解决方案1】:

我已修改 Travis J answer 以不包含 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 =&gt; [...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>

我还想指出关于同一问题的另一个线程,它有一个great answer(供寻求旧版 IE 支持的人使用)

【讨论】:

    【解决方案2】:

    这样可以找到索引

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

    【讨论】:

      【解决方案3】:

      无需循环,在.parentElement.children 上调用Array#indexOf

      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
      

      【讨论】:

        【解决方案4】:

        您可以通过使用 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

        【讨论】:

          【解决方案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;
          }
          

          Demonstration (open the console)

          【讨论】:

          • 这非常有帮助。谢谢!
          • 真的很喜欢这个答案!为什么你需要以return -1 结束?代码永远不会达到这一点。如果你传递了一个无效的元素,你会得到一个错误。
          • @Jessicaindex 函数的通常约定是在未找到元素时返回 -1,而不是错误(或 undefined,因为它没有最后一行)
          • 谢谢!你知道jquery的index()的来源吗?
          • 为什么不使用 parentNode.children 而不是 parentNode.childNodes?它可以允许使用 indexOf 而不是手动增加 num。
          猜你喜欢
          • 1970-01-01
          • 2013-01-01
          • 2014-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 2013-07-05
          • 1970-01-01
          相关资源
          最近更新 更多