1

関連するインライン スクリプトはまったくありません。Twitter から JSONP を取得する外部ファイル スクリプトがあります。返された JSONP で表されるオブジェクトのプロパティが、そのどこかに substring を含む文字列であったとします"</script>"。これは、DOM にまったく追加されずに、それ自体で問題を引き起こす可能性がありますか? (その前にきれいにこすります。)

なぜそうなるのかはわかりませんが、HTML の解析は奇抜で風変わりなことで有名です。インライン スクリプト内に文字列リテラルが必要な場合は、次のようにvar slashScriptContainingString = 'foo</scr' + 'ipt>bar'; 分割する必要があることはわかっています。

<!doctype html>
<script src="file.js"></script>

ファイル.js:

var f = function(twobj) {
  console.log(twobj);
  doOtherStuffWith(twobj);
}

<script src="https://api.twitter.com/statuses/user_timeline/user.json?callback=f"></script>

返された JSONP:

f(["this is an object, returned as part of the JSONP response, except it contains a string literal with the substring \"</script>\".  Is this a problem? Note: I haven't said anything about injecting this string in the DOM in any way shape or form. I can't think of a reason why it might be, but I'd just like to be sure."]);
4

1 に答える 1

2

いいえ、文字列リテラルには、必要なものを含めることができます。何かの をやみくもに設定しようとしない限りinnerHTML、文字列は単なる文字列です。あなたが投稿した例は安全です。

JavaScript ソースでタグを分割する必要があるの</script>は、CDATA ブロックがないためです。それらがなければ、技術的にはインライン JavaScript のすべてを HTML 用に適切にエスケープする必要があります。(<になる&lt;など) ブラウザは親切でスライドさせてくれますが、</script>インライン JavaScript の中ではあいまいになります。このようなことが起こらないようにするには、CDATA ブロックを使用する必要があります。

<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>

詳細については、次の質問を参照してください: スクリプト タグ内で CDATA セクションが必要になるのはいつですか?

于 2012-09-30T06:31:13.967 に答える