It is my understanding that IE8 has access to the Array.prototype.slice
method. Yet when I try to call it to turn a NodeList
into an array, it gives me the error Array.prototype.slice: 'this' is not a JavaScript object
. You can check it out here, or look at my code here:
HTML
<div id="test">Test</div>
JavaScript
var divs = document.getElementsByTagName('div');
divs = Array.prototype.slice.call(divs);
console.log(divs);
What's going on here?
Update: A NodeList
can be treated as an array in some ways - you don't actually have to do anything special with it before you can loop over it, for example:
var aDivs = [];
for (var = i = 0; i < divs.length; i++) {
aDivs.push(divs[i]);
}
This will create an array with all of the nodes that matched when you ran document.getElementsByTagName()
See this question for a full explanation of why slice
works with a NodeList
in some browsers but not others, but it boils down this this sentence from the specification:
Whether the slice function can be applied successfully to a host object is implementation-dependent.
The error message is accurate - your nodelist is not a JavaScript object, it is a "Host Object", which you can't necessarily pass around like regular JavaScript objects. Run this code in IE8's JavaScript console:
document.querySelectorAll("div") instanceof Object
It returns false
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With