1. ホーム
  2. ジャバスクリプト

[解決済み】document.write()で書くとき、なぜ<script>タグを分割するのですか?)

2022-04-18 20:07:44

質問

一部のサイト(またはクライアントにJavaScriptコードを提供する広告主)では、どうして <script> および </script> タグを document.write() を呼び出すのですか?

例えば、Amazonもそうしていることに気づきました。

<script type='text/javascript'>
  if (typeof window['jQuery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></sc'+'ript>');
</script>

解決方法は?

</script> を分割しなければならないのは、そうしないと囲んでいる <script></script> ブロックが早すぎます。本当は </ というのも、スクリプトブロックは(SGMLによれば)次のようになるはずだからです。 は、任意の終了タグオープン(ETAGO)シーケンスで終了する(すなわち </ ) :

STYLEとSCRIPT要素は、そのデータ・モデルにCDATAを使いますが、これらの要素では、CDATAはユーザー・エージェントによって異なった方法で扱われなければなりません。マークアップと実体は、生のテキストとして扱われ、そのままアプリケーションに渡されなければなりません。文字シーケンス "の最初の出現。 </ "(エンドタグオープンデリミタ)は、要素の内容の終端を示すものとして扱われます。有効な文書では、これは要素の終了タグとなる。

しかし、実際にはブラウザはCDATAスクリプトブロックのパースを、実際の </script> クローズタグを使用します。

XHTML では、スクリプトブロックに対してこのような特別な処理は行われません。 < (または & を含む文字でなければなりません。 &escaped; 他の要素と同様です。しかし、XHTMLを旧来のHTMLとして解析しているブラウザは混乱するでしょう。CDATAブロックを使った回避策もありますが、単純にこれらの文字をアンエスケープで使わないようにするのが一番簡単です。どちらのタイプのパーサーでも動作する script 要素を script から書くより良い方法は、次のとおりです。

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>