私はこれが数日前にうまく機能していたことを誓います...
elm = document.querySelectorAll(selector);
var frag = document.createDocumentFragment();
while (elm[0]){
frag.appendChild(elm[0]);
}
そうです、これでelm
ノードリストから各ノードを追加する必要があります。最初のものが追加されると、2番目はノードリストの最初の位置に「移動」するため、次のものは常にelm[0]
です。nodeListが完全に追加されると停止するはずです。elm
しかし、これは私に無限ループを与えています。考え?
編集-私は何度か同じ答えを得たので...AnodeList
は配列ではなく、ライブリファレンスです。ノードが「移動」(ここでは追加)されると、ノードリストから自動的に削除されます。答えはすべて「同じ要素を何度も追加している」と言っています。これが起こっていることですが、そうではないはずです。最初のノードが追加されると、次のノードがそのインデックスを取得するため、forループは機能しないはずです。
2回目の編集
したがって、問題は「なぜnodeList
配列として動作するのか」ということです。ノードリストは、ノードがどこかに追加されるたびに更新される必要があります。最も独特です。
解決策(誰かがライブ+非ライブノードリストを処理するために何かを必要とする場合)
elm = (/*however you're getting a node list*/);
var frag = document.createDocumentFragment();
var elength = elm.length;
for (var b = 0; b<elength; b++){
if (elm.length === elength){
frag.appendChild(elm[b]);
} else {
frag.appendChild(elm[0].cloneNode());
}
}
基本的には、ノードリストの長さが変更されているかどうかを確認するだけです。