しかし、最も残念なことが起こりました。上記のコードは邪悪な IE では正しく動作せず、IE は「JScript オブジェクトが見つかりません」というプロンプトを表示します。
あなたは上記の分析を否定し、操作のために NodeList を Array に変換する必要はないと考えるかもしれません。実際、Lou Zhu は、どのようなプログラミング言語であっても、型変換は非常に賢明ではない行為であると個人的に信じています。最も一般的なものは、C# でのボックス化とボックス化解除、および数値データ変換ですが、これらにはパフォーマンス上の問題があり、注意しないと鉱山事故を引き起こす可能性があります。しかし、Lou Zhu はなぜ NodeList を単独の配列として扱うのでしょうか? NodeList を動的に変更する場合、NodeList を直接操作すると、気付かないうちに誤って制限エリアに入ってしまう可能性が高いためです。以下に例を示します。
(1)、HTML ドキュメントのフラグメント
(2)、JavaScript テスト コード
varアンカー = document.getElementsByTagName("a");
for (i = 0; i var ele= document.createElement("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/"); .appendChild( document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div は新しいリンクを追加します
}
in ドキュメントがロードされたら、上記のスクリプトを実行します。私たちの本来の目的は、div 内の既存の a 要素の後に a 要素を追加することです。ただし、実行してもブラウザはクラッシュしますよね。 Louzhu ここで IE が直接ハングし、FF はスクリプトがビジー状態であることを確認し、スクリプトの実行を停止するかどうかを確認します。停止をクリックした後、ページ内に n 個のリンクが生成されます。実際、その理由を大胆に分析できます。for ループ NodeList (前提: for ループ内に新しい要素が追加され、ノードリストの長さが変わります。提案してくれた Chen Tongxie に感謝します)、その長さは変化し続け、増加します。とループが何度も繰り返され、最終的には無限ループになってしまいました。次のコードを使用すると、期待した効果と同じになります:
var links = document.getElementsByTagName("a");
varアンカー = null; //Array
try {
anchors = Array.prototype.slice.call(links) ;
}
catch (e) { //ie と互換性があります
anchors = new Array();
for (var i = 0; i < links.length; i ) {
anchors.push (links[i]);
}
}
for (i = 0; i
var ele = document.createElement ("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/");
ele.appendChild(document.createTextNode("new)リンクテスト") ;もちろん、これは厳密ではありません。私たちの慣れ親しんだコーディング習慣に少し手を加えるだけです。
コードをコピー
ele.setAttribute("href", "http://www.cnblogs .com/jeffwongishandsome/");
ele.appendChild(document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div は新しいリンクを追加しますLink
}
ここまでで、ご質問のある方も無い方も、読んでいただきありがとうございます。アドバイスをお待ちしております。
作者: ジェフ・ウォン