2015-09-30 11 views
71

コメントに</script>を追加すると、パーサが破損するのはなぜですか?これはバグですか、私が見落としたドキュメントには何かがありますか?コメントに</script>を追加すると、パーサが破損するのはなぜですか?

私はこれをChrome、Firefox、Opera、インターネット エクスプローラでテストしましたが、すべて同じ結果が得られます。

単一行コメント:

function Foo(){ 
 
    // </script> 
 
    alert("bar"); 
 
}; 
 

 
Foo();

複数行コメント:

function Foo(){ 
 
    /* 
 
     </script> 
 
    */ 
 
    alert("bar"); 
 
}; 
 

 
Foo();

+23

htmlの解析では、 ''の出現は、スクリプトが終了したパーサーの唯一の指示です。 –

+9

http://stackoverflow.com/questions/236073/why-split-the-script-tag-when-writing-it-with-document-write – JJJ

+9

@ t.nieseはそれを頭の中に持っています。 ** 'を見つけることができる必要があります。 JavaScriptをサポートしていないブラウザは珍しいかもしれませんが(存在していても現在のものであっても)、*任意の*ブラウザでサポートされている言語についても同じ議論ができます。 IEでのみ動作するように設計されたスクリプトがページに含まれている場合、FirefoxはVBScriptの解析ルールを知る必要がありますか? – hvd

33

HTMLパーサーはJavaScriptを解析しません。それは、<tag></tag>タグで表されるHTML要素のみを解析します。何かがJavaScriptのコメントであることは知られていません。 </script>終了タグを見ると、スクリプト要素が閉じられているとみなされます。文字列</script>が出現した場合でも同じことが起こります。例えば、console.log("</script>")は同じ挙動を生じる。

これは、HTML内にスクリプトを埋め込むのではなく、外部にスクリプトを組み込むのに十分な理由です。

+2

JavaScriptコードに文字列リテラル ''を実際に記録する場合は、 'console.log(" <\/script> ")'と書くことができます。 – dan04

9

あなたは、HTMLエスケープをすることができます埋め込まれたJavaScriptコード

<script type="text/javascript"> 
<!-- 

function Foo(){ 
// </script> 
    alert("bar"); 
}; 

Foo(); 

//--> 
</script> 

したがって、全体のJavaScriptコードは、HTMLパーサとHTMLコメント行はJavaScriptインタプリタによって無視されることにより、HTMLのコメントとして扱われます。

+16

私は同意しません。これは、十数年前の良い習慣で、HTMLパーサが ''、**または**という魔法の文字列が含まれている場合です.XHTMLを扱っている場合は、本当のCDATAでスクリプトをラッピングするほうがよいでしょう。 –

+0

@torazaburoありがとう、答えを –

+2

更新したのは、これまでの歴史的な理由は、一部の初期のブラウザ(Mosaic、Netscape 1など)では、 '

関連する問題