web-dev-qa-db-ja.com

Asp.netのjavascriptでIE 11を検出する方法

こんにちは、ブラウザを検出したい、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;
}

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

17

次のチェックでIE11を明示的に検出できます(feature detectionを使用):

if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
    // is IE11
}

説明:IE(本当に古いものを除く)のすべてのバージョンにwindow.ActiveXObjectプロパティが存在します。ただしIE11はこのプロパティをDOMから非表示にし、そのプロパティは未定義です。オブジェクト内に存在するため、プロパティの存在のチェックはすべてのIEバージョンでtrueを返しますが、IE11では2番目のチェックでもfalseを返します。そして、最後にhasOwnPropertyがObject IE8(および以前のバージョンでは)windowinstanceof Objectではなく、hasOwnPropertyメソッドを持たないためです。

別の方法、serAgent文字列を使用

var ua = window.navigator.userAgent;
var versionSplit = /[\/\.]/i;
var versionRe = /(Version)\/([\w.\/]+)/i; // match for browser version
var operaRe = /(Opera|OPR)[\/ ]([\w.\/]+)/i;
var ieRe = /(?:(MSIE) |(Trident)\/.+rv:)([\w.]+)/i; // must not contain 'Opera'
var match = ua.match(operaRe) || ua.match(ieRe);
if (!match) {
    return false;
}
if (Array.prototype.filter) {
    match = match.filter(function(item) {
        return (item != null);
    });
} else {
    // Hello, IE8!
    for (var j = 0; j < match.length; j++) {
        var matchGroup = match[j];
        if (matchGroup == null || matchGroup == '') {
            match.splice(j, 1);
            j--;
        }
    }
}
var name = match[1].replace('Trident', 'MSIE').replace('OPR', 'Opera');
var versionMatch = ua.match(versionRe) || match;
var version = versionMatch[2].split(versionSplit);

これにより、userAgent文字列がスプーフィングされていない場合、IEのすべてのバージョンが検出されます。

上記のように実際にブラウザ検出を使用する必要がある場合は非常にまれです。 ほとんどの場合、特徴検出アプローチが望ましい

53
Mesqalito
 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }
13
user2919241

IE11を明示的に検出するには、!(window.ActiveXObject) && "ActiveXObject" in windowを使用します。

IEバージョンを検出するには、window.ActiveXObject || "ActiveXObject" in window代わりに。

12
mcw0933

すでに述べたように、ブラウザの検出は行わず、機能の検出を行います。しかし、私が見ているように、あなたのスクリプトはスクリプトの古いバージョンであり、ここを回っています。これは、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;
                            }
5
Tsonev

ブラウザーの検出を避けた方が良いでしょう。ここで必要な場合は、MSチームからの良い説明です:

まれに、IE11プレビューを一意に識別する必要がある場合があります。これを行うには、Tridentトークンを使用します

ユーザーエージェント文字列の変更

多くのレガシーWebサイトでは、IE11プレビューの最も目に見える更新の一部には、ユーザーエージェント文字列が関係しています。 Windows 8.1 PreviewでのIE11 Previewについて報告されているのは次のとおりです。JavaScript

GeckoのようなMozilla/5.0(Windows NT 6.3; Trident/7.0; rv:11.0)

Internet Explorerの以前のバージョンと同様に、ユーザーエージェント文字列の部分は環境によって異なります。 Windows 7でのIE11プレビューの文字列は次のとおりです。JavaScript

GeckoのようなMozilla/5.0(Windows NT 6.1; Trident/7.0; rv:11.0)

これらの文字列を以前のバージョンのInternet Explorerで報告された文字列と比較すると、次の変更点が見つかります。互換( "compatible")およびブラウザー( "MSIE")トークンが削除されました。 「like Gecko」トークンが追加されました(他のブラウザーとの一貫性のため)。ブラウザのバージョンは、新しいリビジョン( "rv")トークンによって報告されるようになりました。これらの変更は、IE11プレビューが以前のバージョンとして(誤って)識別されるのを防ぐのに役立ちます。一般に、特定のブラウザーまたはブラウザーのバージョンを検出することは避けてください。このようなテストの基礎となる仮定は、ブラウザーが更新されたときに偽陽性の結果につながる傾向があります。代わりに、必要に応じて機能を検出し、プログレッシブエンハンスメントを使用して、必要な機能をサポートしていないブラウザーまたはデバイスにシンプルなエクスペリエンスを提供します。まれに、IE11プレビューを一意に識別する必要がある場合があります。これを行うには、トライデントトークンを使用します

リンク: http://msdn.Microsoft.com/en-us/library/ie/bg182625(v = vs.85).aspx

3
Irvin Dominin

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

if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}
1
Serginho

「機能検出を使用する」というマントラは、私を混乱させます。バグに遭遇した場合、どのような「機能」が犯人であるかをどのように判断できますか?たとえば、次のコードをご覧ください。

        $('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まで)のどのバージョンでも動作しません。入力フィールドでの後続のバインディングは失敗します。

0
Jeff Lowery

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

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

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

0
Dhananjay Tomar