1

私は最近、.js ファイルから JavaScript コードを読み取り、それを HTML コードのスクリプト タグ内に埋め込む必要があるプロジェクトに取り組みました。これは些細な作業だと思っていましたが、.js ファイル内では問題を引き起こさない一部のシーケンスが、HTML ファイルのスクリプト タグ内に埋め込まれた場合に望ましくない機能が発生する可能性があることを知るまでは。

たとえば、有効な JavaScript コードを含む .js ファイルに次のようなシーケンスが含まれているとします。

/*
    ...comments...
    Add the following to your HTML:
    <script language="javascript" src="samplejs.js"></script>
    ...comments...
 */

...これらのシーケンスが HTML ファイルの script タグ内に埋め込まれていると、インタープリターが行にヒットしたときに問題が発生します。

"<script language="javascript" src="samplejs.js"></script>"

(少なくとも、これは Firefox の場合です。)

正規表現以来...

"\<script.*\>.*\</script\>"

...文字列リテラルの一部として表示される場合でも、スクリプト タグをキャッチします。すなわち:

document.write('<div><script>doSomething()</script></div>')

...問題の解決策は、より堅牢な正規表現です(次のようなものです

"/\*.*\<.*\>.*\</.*\>.*\*/"

...)、または別のアプローチですか?

(すべてのコメントを取り除くことはオプションではないと仮定します)

4

3 に答える 3

1

Simplest as in least effort for you? I'd run it through a minifier such as UglifyJS on the way in, which should remove comments among other things.

于 2013-01-24T19:13:32.300 に答える
1

ファイルを ajax で読み込んでタグに書き込む理由が思いつきませんが、正しい方法 (または//プロパティに割り当てる<script>など) を使用すれば、まったく問題ないはずです。createTextNodetexttextConentinnerText

ただしdocument.write、を使用している場合は、もちろんその中の HTML をエスケープする必要があります。<>&"これは、それぞれのエンティティに置き換えることを意味します。

于 2013-01-24T19:58:20.173 に答える
0

</script>のすべてのインスタンスをに置き換えていただけませ\u003C/script>んか? 理論的には、これは文字列には影響しませんが (以来'\u003C' == '<')、ブラウザがコメントを誤って解釈するのを防ぎます (/*\u003C/script>*/スクリプト ブロックを途中で終了させることはありません)。

これはすべて自動化されているように見えるので、時折文字列を少し「マングリング」しても胸やけにはならないと思います。

于 2013-01-24T19:01:29.347 に答える