私はいくつかのオンラインの例でIEを検出するこの方法を見てきました:
if (/*@cc_on!@*/false) { // check for Internet Explorer
これは、IEがHTMLで認識する条件付きコメントに似ていますか?
私はいくつかのオンラインの例でIEを検出するこの方法を見てきました:
if (/*@cc_on!@*/false) { // check for Internet Explorer
これは、IEがHTMLで認識する条件付きコメントに似ていますか?
このステートメントは、IEでのコメントコンテンツの条件付きコンパイルを制御します。IEがこのコメントを見ると、実際にはコメントブロックの内容を純粋なコードとしてコンパイルします。!
これで、コメント内のでトリックが発生します。
IEは、!
ソースに書き込まれたかのようにコンパイルするため、コードはとして処理されますがif (!false)
、他のすべてのブラウザーはそれをとして処理しますif (false)
。
マイクロソフトは、これについていくつかの役立つ洞察を提供しています。
この宣言は、ブラウザが条件付きコンパイルをサポートするかどうかをスクリプトに指示しているように見えます。サポートする場合は、次のコードを実行します。
/*@ ...
... @*/
ここに良い説明があります
条件付きコンパイル。
この方法は、現在選択されている方法です。ディーン・エドワーズは、彼のブログ投稿Sniffでこのアプローチの宝石について説明しました。私の知る限り、これはIEを検出するための最もクリーンで信頼性の高い方法です。
var isMSIE = /*@cc_on!@*/false;
簡単ですね。ユーザーエージェント、20行の条件文および文字列検索はありません。
このコードはどのように機能しますか?Internet Explorerは、Microsoftが開発した独自の形式のJavaScript(ECMAScript)であるJScriptを使用します。JScriptには条件付きコンパイルと呼ばれる機能があり、特別にフォーマットされたコメント内にJScript固有のJavaScriptを追加できます。他のJavaScriptコンパイラは、コメントであると考えてこのコードを無視しますが、JScriptはそれを認識して処理します。
/ * @ cc_onがコメントを開始し、@*/がコメントを終了します。
IE以外のブラウザがvarisMSIE= / * @ cc_on!@ * / false;を認識すると、実際にはvar isMSIE=false;と見なされます。Internet ExplorerのJScriptは、コメントに含まれる感嘆符を追加します。つまり、IEはvar isMSIE =!false;を認識します。感嘆符はブール値を逆にするため、!falseはtrueと同等であることを忘れないでください。
ディーンが指摘したように、これを書くためのさらに簡単な方法があります(少し読みにくいですが):
var isMSIE/*@cc_on=1@*/;
宣言時に変数に値が割り当てられていない場合、デフォルトでは「false」(null)が返されます。したがって、IE以外のブラウザでは、この行がvarisMSIEと見なされます。InternetExplorerのJScriptはそれをvarisMSIE=1と見なします。(1を割り当てると、変数は'truthy'になります)。
isMSIEからMSを削除して、単純にisIEにすることで、もう少し短くしたいと思います。注:通常は準質問形式で、ブール値が何を表すかを示す名前をブール値に付けることをお勧めします。プレーンな古い変数IEを使用しても、変数がブール値であることがわかりません。また、ブール値がどの質問に答えているかもわかりません。varisIEはそうします。
var isIE/*@cc_on=1@*/;
if(isIE){
//Do something. I suggest downloading Firefox. ^_^
}