[解決済み] JavaScriptからHTMLを生成する際、<ではなく、なぜ" \x3C "を使用するのですか?
質問
コンテンツデリバリーネットワークからjQueryを読み込み、CDNが利用できない場合はローカルコピーにフォールバックするために、次のHTMLコードがよく使われているのを見かけます(例. Modernizr ドキュメント ):
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.1.min.js">\x3C/script>')</script>
質問ですが、なぜ最後の
<
の文字は
document.write()
ステートメントをエスケープシーケンスに置き換えたものです。
\x3C
?
<
はJavaScriptでは安全な文字であり、同じ文字列の中で先に使われていることさえあるのですが、なぜそこでエスケープするのでしょうか?それは、悪質なブラウザの実装が
</script>
が本当のスクリプト終了タグなのでしょうか?もしそうなら、この件で失敗するようなブラウザは本当にあるのでしょうか?
続いての質問ですが、私はまた、このように
unescape()
(にあるように)。
この答え
)も何度か野放しになっています。そのバージョンがいつも
すべて
その
<
と
>
という文字がありますか?
解決方法は?
ブラウザが
</script>
HTMLパーサーはJavaScriptについて全く知らないので、文字列の中に現れたものと、それが
実際の意味
を使用して script 要素を終了させます。) そのため
</script>
がHTMLページ内のJavaScriptに文字どおり現れると、(良い場合は)エラーの原因となり、(悪い場合は)巨大なセキュリティホールとなります。
そのため、どうにかしてこの文字列が表示されないようにする必要があるのです。この問題に対する他の一般的な回避策は
"<"+"/script>"
と
"<\/script>"
(いずれも同じものになる)。
これをバグと考える人もいますが、実際には
でなければならない
のように、このようになります。
仕様
ユーザーエージェントのHTML部分は、スクリプトエンジンから完全に分離されています。あなたは、あらゆる種類のものを
<script>
タグは、JavaScriptだけではありません。W3Cでは、VBScriptやTCLを例として挙げています。また、他の例として
jQueryテンプレートプラグイン
というタグがあり、このタグも使われています。
しかし、JavaScriptの中でも、文字列の中のこのようなコンテンツは認識できるため、終了タグとして扱わないという提案ができるのですが、コメントを考慮すると、次のような曖昧な点がでてきます。
<script type="text/javascript">foo(42); // call the function </script>
- この場合、ブラウザはどうすればいいのでしょうか?
最後に、JavaScriptを知らないブラウザはどうでしょう?の間の部分は無視されるだけでしょう。
<script>
と
</script>
という文字列に異なるセマンティクスを与えたとします。
</script>
に基づいて
ブラウザのJavaScriptの知識
を使うと、突然2つの異なる結果が
HTMLパース段階
.
最後に、ご質問のあった
すべて
の角括弧を使用します。少なくとも99%の場合、難読化のため、つまり、JavaScriptがHTML的なことをやっているという事実を(アンチウイルスソフトや検閲プロキシ(あなたの例のように(入れ子の括弧は素晴らしい))等から)隠すためだと思います。以外のものを隠す技術的な理由は思いつきません。
</script>
少なくとも最近のブラウザ(つまり、Mosaicより新しいもの)では、そうではありません。
関連
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] encodeURI / encodeURIComponentの代わりにescapeを使用するのはどのような場合ですか?
-
[解決済み】なぜHTMLは "chucknorris "を色と見なすのか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】エラー:リスン EACCES 0.0.0.0:80 OSx Node.js
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]