1

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

4

0 に答える 0