Это связано с тем, что вы выполняете итерацию вперед (0-> n) по массиву ссылок, одновременно манипулируя его длиной.Когда вы удаляете элемент i
, вы активно сокращаете массив.Как в этом примере:
let arr = ['A','B','C','D','E','F'];
console.log('started');
for (let i = 0; i < arr.length; i++) {
var removed = arr.splice(i, 0);
console.log('i:'+i,'Arr:',arr, '(removed ' + i + ')');
}
console.log('ended');
это вывело бы следующее:
started
i:0 Arr: [B,C,D,E,F] (removed A)
i:1 Arr: [B,D,E,F] (removed C)
i:2 Arr: [B,D,F] (removed E)
ended
Однако, если вы захотите изменить цикл for для итерации в обратном направлении, вы не получитеэта проблема, поскольку вы всегда нацеливаетесь на элемент, который не был удален.
for (let i = captions.length - 1; i >= 0; i--) {
...
}
6 tables 6 captions
index : 5
index : 4
index : 3
index : 2
index : 1
index : 0
Так почему же это происходит только при использовании externalHtml?Причина этого в том, что x.innerHtml = ""
очищает содержимое элемента (<div>test</div>
-> <div></div>
), а x.outerHtml = ""
перезаписывает сам элемент (<div>test</div>
->
).