2017-03-16 7 views
-2

OK、これは好奇心から、純粋である:私は、次のマークアップは、HTMLドキュメント内の有効であると期待していた。<script>ブロックに "</script>"という文字列定数が含まれていないのはなぜですか?

<script> 
 
    var test = "<script>why? 
 
</script>"; 
 
</script>

しかしいいえ:これは「終端されていない文字列定数」エラーが発生最初にブロックが終了するのは</script>で、引用符で囲まれています。

誰かがこれがなぜ起こっているのか説明できますか?

+1

これはいかがですか? 'var test =" 」、[ここから](https://www.w3.org/TR/html5/syntax.html#script-data-state)です。 –

答えて

1

HTMLエンジンとJavaScriptエンジンは2種類あります。まず、HTMLエンジンが文書を解析します。その後、JavaScriptコードのチャンクをJavaScriptエンジンに渡します。

HTMLはJavaScriptシンタックスを知らないので、終了タグをコンテンツ全体の一部として見て、タグの内容を気持ちよくJavaScriptに渡します(CSSエンジンとCSSエンジンなど)。エンジン:あなたが解析規則に従っている場合

<script> 
    var test = "<script>why? 
</script> 
具体的

は、hereを開始...

  1. 最初<script>

    は、 "スクリプトのデータ状態" で私たちを入れて
  2. 私たちは、「小なり記号状態スクリプトのデータを」我々はいくつかの文字後に、私たちは別の遭遇に「スクリプトのデータ状態」
  3. 返さsを、遭遇した
  4. 入力された最初の<、までそこに残りました私たちが入る<、我々は、我々は「スクリプトデータ終了タグ開いた状態」
  5. などを入力し/を、遭遇
  6. 「状態に署名小なりのスクリプトデータ」

仕様に従うことはできますが、HTMLエンジンが各文字を直感的に解釈する方法にかかわらず、各文字をHTML構文としてどのように構文解析するかについてのステップバイステップの詳細を説明しています。

+0

James Thorpeが自分のコメントに投稿したW3C仕様へのリンクを私の質問に追加することができますか? –

+0

@GyumFox:良い提案、私は答えを更新しました。私は前にそのスペックのその部分を実際に見たことがなかった、それに沿って従うことは面白かった。ありがとう! – David

4

HTMLパーサはJavaScriptについて何も知らない。最初の</script>が文字列リテラルの内側にあることはわかりません。最初に表示されるのは</script>で、これがブロックを閉じると考えられます。ここで

はJavaScriptで多分よりrelateable例です。

var foo = "He said: "Let's go!""; 

JavaScriptのパーサは、人間のダイアログ(例えば、我々は通常、引用符の中に「スピーチ」を置くこと)のテキスト表現について何も知りません。 2番目の引用符が表示され、文字列リテラルが終了すると考えられます。しかし、これは私たちが意図するものではないので、内部引用符をエスケープしてパーサーを助けなければなりません。

関連:Why split the <script> tag when writing it with document.write()?

+1

「関連する」とは重複しません。またはhttp://stackoverflow.com/q/23038617/215552? –

+1

@MikeMcCaughan:もう1つの質問で、スクリプトブロックが最初に「」に終わった理由を説明できないように思えます。しかし、* this *の質問への答えがスクリプトブロック*を閉じるので単純に*であれば、それは確かに重複しています。 –

3

は、あなただけの/文字をエスケープする必要があります。

<script> 
var test = "<script>why?<\/script>"; 
</script> 
関連する問題