2009-11-02 20 views
33

JavaScriptで引用文字列内に終了スクリプトタグがあり、スクリプトを強制終了する問題が発生しました。私はこれが期待された動作ではないと仮定します。この例はここにあります:http://jsbin.com/oqepe/editJavaScript文字列内のスクリプトタグ

私のテストケースのブラウザ興味深い:Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.1.4)Gecko/20091028 Ubuntu/9.10 karmic)Firefox/3.5.4。

答えて

64

どうしますか?

ブラウザのHTMLパーサでは、文字列内に</script>が表示され、スクリプト要素の末尾として解釈されます。この例の構文の色分けで

ルック:単語バーはscript要素の外側のテキストコンテンツとして扱われている...

A一般的に使用される技術であることを

<script> 
var test = 'foo... </script> bar.....'; 
</script> 

注意連結演算子を使用する:

var test = '...... </scr'+'ipt>......'; 
+3

これはうまくいくが、私はそれをやらなければならないことに驚いている。問題の一部は、ページをスクラップしてJS変数に結果を格納することです。私は戻ってくるものについて本当の期待はない。 – re5et

+0

どのように変数に格納していますか?あなたはサーバ側を掻き立てて、 'var x = ;'を生成していますか?その場合は、JSONエンコードすることを忘れないでください。 – orip

+12

/をエスケープします。文字列を分割しないでください。 IIRCでは、HTML 4.xではまだエラーです。確かにタイプするのが面倒で、読みにくく、扱う文字が多く、効率が悪いです(文字列の連結はJSの操作の中で最も安いからです) – Quentin

11

これをエスケープする必要があります。それ以外の場合はHTMLの一部になります。

var test = 'what the hell... \<\/script\> \<h1\>why?!?!?!\<\/h1\>'; 
+5

これは間違っています。これはテキストを格納している変数です。 HTMLには挿入されません。スクリプト以外のタグを使用しても同じ結果は得られません。 – re5et

+0

これは、XMLがレンダリングされる方法です。 <![CDATA [および]]>を使用してスクリプトをラップすることもできます。他のタグでは起こりません。なぜなら、XMLパーサーが動作する方法(特にスクリプトをテキストとして扱い、コードとして扱わないため)です。 – LiraNuna

+1

@LiraNunaうん。 XMLパーサーは、 ''を「スクリプトの終わり」として扱い、フォームのエラーとして「」を扱います。 HTMLパーサーは ''を「スクリプトの終わり」として扱い、「」が「仕様で未定義の処理でエラーがある」とします。タグスープパーサー(とおそらくHTML5パーサー、私は十分に確認するために十分にドラフトを読んでいない)は、スクリプトの一部として ''を扱います。 – Quentin

関連する問題