17

こんにちは、ブラウザを検出したいのですが、IE 8 以上が適しています。このために、次のコードを使用しましたが、IE 11 では失敗します。他の場合は、適切に検出します。

function getInternetExplorerVersion()
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    return rv;
}

以下は、私も試しましたが成功しなかったリンクです。

4

10 に答える 10

13
 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }
于 2013-10-25T09:04:03.453 に答える
5

既に述べたように、ブラウザーの検出を行うのではなく、機能の検出を行います。ただし、あなたのスクリプトは、ここで流通しているスクリプトの古いバージョンです。これは、IE 11 aswel を検出する更新バージョンです。

function getInternetExplorerVersion()
                            {
                                var rv = -1;
                                if (navigator.appName == 'Microsoft Internet Explorer')
                                {
                                    var ua = navigator.userAgent;
                                    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                                    if (re.exec(ua) != null)
                                        rv = parseFloat( RegExp.$1 );
                                }
                                else if (navigator.appName == 'Netscape')
                                {
                                    var ua = navigator.userAgent;
                                    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                                    if (re.exec(ua) != null)
                                        rv = parseFloat( RegExp.$1 );
                                }
                                return rv;
                            }
于 2013-11-15T10:38:59.043 に答える
1

より簡単で効率的なコードと IE/Edge のすべてのバージョンの検出:

if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}
于 2015-07-03T23:28:31.757 に答える
0

最近、次のコードを使用してIEを一般的に検出しましたが、IE 11でも問題なく機能しました

var bs = document.body.style, isIE=false;
if ('msTransition' in bs) {
        isIE = true;
}

アイデアは、vedor プレフィックスを探すことです。

于 2014-01-05T06:24:20.383 に答える
0

「機能検出を使用する」というマントラは、私を当惑させます。バグに遭遇したとき、どの「機能」が原因であるかをどのように判断できますか? たとえば、次のコードを見てみましょう。

        $('input[name^=qty]').keyup(function(e) {
            if (this.value.match(/[^0-9\/]*/g)) {
                this.value = this.value.replace(/[^0-9\/]/g, '')
            }
        });

ユーザーが入力すると、入力フィールドから数値以外の文字が削除されます。FF、Chrome、および Safari で動作します。どのバージョンの IE でも機能しません (少なくとも 11 まで): 入力フィールドでの後続のバインドはすべて失敗します。

于 2014-08-21T18:46:36.923 に答える
-10

ブラウザ検出を行わないでください! 壊れますし、トラブルの原因になります。

IE11 には、以前の IE バージョンとはまったく異なるユーザー エージェント文字列があります。「MSIE」テキストは含まれなくなりました。これが、検出コードが機能しない理由です。

ここで、彼らがこれを行った理由は意図的であったことに注意することが重要です。彼らは、このようなブラウザ検出スクリプトを壊したいと考えていました。

IE11 で動作するようにコードを変更することは可能ですが、IE12 が出てきたときに同じ問題が再び発生する可能性があるため、これを行わないことを強くお勧めします。

では、なぜブラウザ検出スクリプトを破ろうとしたのでしょうか? シンプル: IE11 には以前のバージョンのバグがなく、多くの新機能があるためです。したがって、IE に特定のバグや不足している機能があるためにブラウザー検出を行っており、ブラウザー検出に基づいてそれらの問題を修正するコードを持っている場合、そのコードは実際には、修正が不要な IE11 でさらに悪い問題を引き起こす可能性があります。

IE11 ではスクリプトが壊れていますが、同じロジックがすべてのブラウザーとすべてのバージョンに適用されます。ブラウザとバージョンを検出することは、ほとんどの場合間違っています。

サポートしたい特定の機能が古い IE バージョン (または他の古いブラウザー) にない場合は、ブラウザー検出を使用して解決しないでください。代わりに機能検出を使用する必要があります。

機能の検出とは、ブラウザをチェックして、使用したい特定の機能をサポートしているかどうかを確認することです。これを行う最も一般的な方法は、Modernizrライブラリを使用することです。彼らのサイトのドキュメントは、それを設定する方法を案内します。

古いバージョンの IE には検出が困難なバグがいくつかあります。これらのいくつかのケースでは、最後の手段としてブラウザー検出を使用することが有効ですが、これらのケースは実際には IE6 以前のみに限定されます。IE7 の場合もあるかもしれません。しかし、IE8以降のみを見ていると質問で述べたので、それは当てはまりません。

機能検出に固執します。より信頼性が高く、より優れた方法であり、新しいブラウザー バージョンがリリースされたときに突然機能しなくなることはありません。

于 2013-09-18T12:17:52.350 に答える