Ваша проблема с изменением allnodes заключается в том, что вы на самом деле мутируете узловые дочерние узлы textContent
массива и тем самым также изменяете длину allnodes
массива, уменьшая его размер, чтобы цикл продолжал проходить за конец недавно укороченного массива.
Обратитесь к веб-документам MDN для того, что textContent
делает:
function refreshLabels() {
// loop through all document elements
var allnodes = document.body.getElementsByTagName("*");
console.log(allnodes.length)
for (var i = 0, max = allnodes.length; i < max; i++) {
// get id current elements
var idname = allnodes[i].id;
// if id exists, set get id current elements
if (idname !== '') {
allnodes[i].textContent = idname;
console.log(allnodes.length) // this length will change
}
}
}