document.write を介して含まれる外部スクリプトからグローバル変数を変更できるかどうかを確認するために、いくつかのテストを行いました。私はそれが可能だと思っていましたが、そうではありません! 誰かがこれについて説明していますか?
調査結果:
次の方法でグローバル変数を更新します。
- document.write を介してインクルードされた外部スクリプトは、インクルード スクリプトには表示されません。
- document.write を介してインクルードされたインライン スクリプトがインクルード スクリプトから見えるようになる
最初に元のスクリプト タグが終了します。次に、document.write を介して追加されたスクリプトが挿入順に実行されます。
一方、JavaScript の実行結果を使用して document.write を介して書き込まれたコンテンツは、正しい順序 (深さ優先) で挿入されますが、それでもスクリプトの実行時に定義された値が使用されます。
外部ファイルの末尾に alert(x) を追加すると、変更された値が 1 つの基本コンテキストに反映されます。しかし、ユーザーの操作なしにこれをトリガーすることは不可能のようです。
テスト設定
私のテストは次のとおりです。base.html のインライン スクリプトから、document.write を使用して、それ自体がファイル two.js を含む javascript one.js を含めます。各ファイルは、コンソールと document.write を介して値を出力し、値を設定します。
base.htmlのインライン スクリプトのスニペット
var x = "base";
console.log("x at start base: "+x);
document.write("<p>x at start base "+x+"</p>")
document.write('<scr'+'ipt type=\"text/javascript\" src=\"one.js\"></scri'+'pt>');
document.write("<p>x at end base: "+x+"</p>");
console.log("x at end base: "+x);
ファイルone.js
console.log("Start One: "+x);
document.write("<p>Start One "+x+"</p>");
x = "1";
document.write('<scr'+'ipt type=\"text/javascript\" src=\"two.js\"></scri'+'pt>');
document.write("<p>End One "+x+"</p>");
console.log("End One: "+x);
ファイルtwo.js
console.log("x at start two.js: "+x);
document.write("x at start two.js: "+x);
x = "2";
document.write("<p>x at end two.js: "+x+"</p>");
console.log("x at end two.js: "+x);
結果
コンソール出力:
x at start base: base
x at end base: base
x at start one.js: base
x at end one.js: 1
x at start two.js: 1
x at end two.js: 2
ページ出力: 正しい順序を表示しますが、値が間違っています (ファイル two.js に設定された 2 は、one.js の最後とベース js の最後に伝播されません。
x at start base: base
x at start one.js: base
x at start two.js: 1
x at end two.js: 2
x at end one.js: 1
x at end base: base
よろしくお願いします Cotopax