jQuery index() in vanilla javascript

前端 未结 5 1608
北荒
北荒 2020-12-01 12:16

As per the jQuery api, the complementary operation to .get(), which accepts an index and returns a DOM node, .index() can take a DOM node and returns an index.

相关标签:
5条回答
  • 2020-12-01 12:29

    Index can be found in this way

        Array.from(children).findIndex(element => element.id === "bar")
    
    0 讨论(0)
  • 2020-12-01 12:31

    You can find this information out by going up the dom tree using previousElementSibling and incrementing.

    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'));
    

    here is the browser support for previousElementSibling:

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

    0 讨论(0)
  • 2020-12-01 12:46

    You can build your own function :

    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)

    0 讨论(0)
  • 2020-12-01 12:51

    No loops needed, call Array#indexOf on .parentElement.children:

    const element = document.querySelector('#baz');
    
    [].indexOf.call(element.parentElement.children, element);
    // => 2
    

    You can even call it on a random list of elements, just like you can in jQuery:

    const list = document.querySelectorAll('li');
    const element = document.querySelector('#baz');
    
    [].indexOf.call(list, element);
    // => 2
    
    0 讨论(0)
  • 2020-12-01 12:56

    I've modified Travis J answer to not include TextNodes and made a function out of it.

    You can run it in the console and see (on stackoverflow).

    Classic way:

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

    With ES2015:

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

    Demo:

    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>


    I also want to point to another thread on the same matter, which has a great answer (for people seeking older IE support)

    0 讨论(0)
提交回复
热议问题