jQuery やアドオン ライブラリを使用せずに、JavaScript で IE およびバージョン 9 未満のブラウザを検出するための最速、最短 (最良) の方法は何でしょうか?
14 に答える
Javascript
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while (
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
その後、次のことができます。
ie < 9
ここからJames Panolseyによる:http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments
それが価値があるもののために:
if( document.addEventListener ){
alert("you got IE9 or greater");
}
addEventListenerこのメソッドは、IE を除くすべての主要なブラウザーで非常に早い段階でサポートされていたため、IE 9 以降をターゲットにしています。(Chrome、Firefox、Opera、および Safari) MDN リファレンス。現在 IE9 でサポートされており、今後も引き続きサポートされることが期待できます。
条件付きコメントを使用すると、IE 9 未満でのみ実行されるスクリプト ブロックを作成できます。
<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]-->
もちろん、このブロックの前に を宣言するユニバーサル ブロックを配置することもできvar is_ie_lt9=falseます。これは 9 未満の IE ではオーバーライドされます (その場合、var繰り返しになるため、宣言を削除する必要があります)。
編集:インライン スクリプト ブロック (外部ファイルから実行可能) に依存しないが、ユーザー エージェント スニッフィングを使用しないバージョンを次に示します。
@カウボーイ経由:
with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
条件付きコメントにバァ!ずっと条件付きコード!!! (愚かな IE)
<script type="text/javascript">
/*@cc_on
var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
真剣に、それがあなたにより適している場合に備えて、これをそこに捨ててください...それらは同じものです。これは、インラインHTMLではなく.jsファイルにすることができます
注: ここで jscript_version チェックが「9」であるのはまったくの偶然です。8、7 などに設定すると、「is IE8」はチェックされません。これらのブラウザーの jscript バージョンを検索する必要があります。
以下は、James Padolsey のソリューションを改善したものです。
1) メモリを汚染しません (たとえば、James のスニペットは、IE11 を検出すると、7 つの未削除のドキュメント フラグメントを作成します)。
2) マークアップを生成する前に documentMode 値をチェックするため、高速です。
3) 特に JavaScript プログラマーの初心者にとっては、はるかに読みやすくなっています。
要点リンク: https://gist.github.com/julianshapiro/9098609
/*
- Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
- Behavior: For <IE8, we inject conditional comments until we detect a match.
- Results: In IE, the version is returned. In other browsers, false is returned.
- Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/
var IE = (function() {
if (document.documentMode) {
return document.documentMode;
} else {
for (var i = 7; i > 0; i--) {
var div = document.createElement("div");
div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";
if (div.getElementsByTagName("span").length) {
return i;
}
}
}
return undefined;
})();
var ie = !-[1,]; // true if IE less than 9
このハックは、ie5、6、7、8 でサポートされています。これは ie9+ で修正されています (したがって、この質問の要求に適合します)。このハックは、すべての IE 互換モードで機能します。
仕組み: つまり、エンジンは空の要素を持つ配列 (この [,1] など) を 2 つの要素を持つ配列として扱いますが、他のブラウザーは要素が 1 つしかないと考えます。したがって、この配列を + 演算子で数値に変換すると、次のような処理が行われます: (',1' in ie / '1' in other)*1 と、ie では NaN、その他では 1 が得られます。それをブール値に変換し、! で値を逆にします。単純。ちなみに、! なしで短いバージョンを使用できます。記号ですが、値は反転されます。
これは今のところ最短のハックです。そして私は著者です;)
代わりにオブジェクト検出を使用することにしました。
これを読んだ後: http://www.quirksmode.org/js/support.html とこれ: http://diveintohtml5.ep.io/detect.html#canvas
私は次のようなものを使用します
if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
このリンクには、Internet Explorer のバージョンの検出に関する関連情報が含まれています。
http://tanalin.com/en/articles/ie-version-js/
例:
if (document.all && !document.addEventListener) {
alert('IE8 or older.');
}
正規表現と を使用して、すばやく汚れた方法でそれを行うことができます.match()。
if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
// ie less than version 9
}
私があなたなら、条件付きコンパイルまたは機能検出を使用します。
別の方法を次に示します。
<!--[if lt IE 9]><!-->
<script>
var LTEIE8 = true;
</script>
<!--<![endif]-->
JavaScriptで行う必要がありますか?
そうでない場合は、IE 固有の条件付きコメント構文を使用できます。
<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
// IE8 or less
}
- 次を使用してIEバージョンを抽出します。
/MSIE\s(\d+)/.exec(navigator.userAgent) - IE 以外のブラウザの場合、これが返さ
nullれるため、その場合||0はそれnullを0 [1]IE のメジャー バージョンを取得するかundefined、IE ブラウザではない場合- リーディング
+はそれを数値に変換し、undefinedに変換されますNaN - 数値と比較する
NaNと常に返されますfalse