The NodeList don't have a indexOf(element) method? So, how can I get the element index?
-
3can you un-accept the accepted answer please? The person who wrote it even agrees it's not the best answer – Boris Verkhovskiy Dec 23 '19 at 22:22
5 Answers
You can use Array.prototype.indexOf.call() like this
let nodes = document.getElementsByTagName('*');
Array.prototype.indexOf.call(nodes, document.body);
- 10,733
- 7
- 77
- 79
- 98,993
- 30
- 103
- 125
-
7To make it mega obvious, usage is like `Array.prototype.indexOf.call(haystack, needle);` – wkille Sep 23 '20 at 09:36
The NodeList objet is an Array-like object. So it's possible to "convert" it into an Array using Array.prototype.slice.call()
var arr = Array.prototype.slice.call(yourNodeListObject); // Now it's an Array.
arr.indexOf(element); // The index of your element :)
On browsers that support ES6 you can also do this with Array.from()
const arr = Array.from(yourNodeListObject);
or using the spread operator ...
const arr = [...yourNodeListObject];
- 10,733
- 7
- 77
- 79
- 848
- 4
- 8
By iterating over the elements, and checking if it matches.
Generic code that finds the index of the element within it's parents childNodes collection.
function index(el) {
var children = el.parentNode.childNodes,
i = 0;
for (; i < children.length; i++) {
if (children[i] == el) {
return i;
}
}
return -1;
}
Usage:
// should return 4
var idx = index(document.body.childNodes[4]);
EDIT: I can't delete an accepted answer, but @kennebec's answer below is much better, which I'll quote verbatim:
You can use
Array.prototype.indexOf.call()like thislet nodes = document.getElementsByTagName('*'); Array.prototype.indexOf.call(nodes, document.body);
- 11,598
- 10
- 47
- 95
-
4is there a design reason the nodelist doesn't have an indexof operation? – amwinter Dec 20 '12 at 17:09
-
4
-
1I wish I could upvote your username other than the answer @try-catch-finally – handris Apr 23 '19 at 06:33
Let us say you have the following line:
const list=document.querySelectAll('.some_class .someother_class');
list will be a nodelist. So we can convert the nodelist to an array and create a new array of indexes as follows:
const indexArr= [...list].map( element => return [...list].indexOf(element) );
indexArr contains all the indexes of elements in the original list.
- 21
- 6
Just add one line in your script:
NodeList.prototype.indexOf = Array.prototype.indexOf; // for IE11
Then use indexOf as usual:
var index = NodeList.indexOf(NodeElement);
- 73
- 3
-
-
More explanation would be nice. But on face value it seems to be just a roundabout way of casting into an array which is why it works the same way as the answers above. – 4127157 Apr 19 '22 at 16:23