web-dev-qa-db-fra.com

Comment détecter IE 11 avec javascript dans Asp.net

Bonjour, je veux détecter le navigateur, IE 8 ou plus me conviendra. Pour cela, j'ai utilisé le code suivant mais il échoue pour IE 11. Pour autre sa détection correctement.

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;
}

Ci-dessous le lien que j'ai aussi essayé mais qui n'a pas réussi.

17
Abhinash Mohanty

Vous pouvez explicitement détecter IE11 avec la vérification suivante (en utilisant détection de fonctionnalité):

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

Explication: toutes les versions de IE (sauf les très anciennes) ont window.ActiveXObject propriété présente. IE11, cependant, masque cette propriété du DOM et cette propriété n'est plus définie. Mais la propriété elle-même est présente dans l'objet, donc la vérification de la présence de la propriété renvoie true dans toutes les versions IE, mais dans IE11, elle renvoie également false pour la deuxième vérification. Et, enfin, hasOwnProperty est appelé via Object car dans IE8 (et je crois plus tôt) window n'est pas un instanceof Object et n'a pas de méthode hasOwnProperty.

Une autre méthode, en utilisant la chaîne userAgent:

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);

Cela détectera toute version de IE si sa chaîne userAgent n'a pas été usurpée.

Il existe de très rares cas où vous devez réellement utiliser la détection de navigateur comme décrit ci-dessus. Dans la plupart des cas, l'approche de détection des fonctionnalités est préférable.

53
Mesqalito
 isIE11 = !!window.MSStream;

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

Utilisez !(window.ActiveXObject) && "ActiveXObject" in window pour détecter explicitement IE11.

Pour détecter une version IE version, utilisez window.ActiveXObject || "ActiveXObject" in window au lieu.

12
mcw

Comme déjà indiqué - ne faites pas de détection de navigateur, faites plutôt la détection de fonctionnalités. Cependant, comme je vois votre script est une ancienne version d'un script qui circule ici. Ceci est la version mise à jour qui détecte 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

C'est mieux pour vous si vous évitez la détection du navigateur; si vous en avez besoin, voici une bonne explication de l'équipe MS:

Dans de rares cas, il peut être nécessaire d'identifier uniquement l'aperçu IE11. Utilisez le jeton Trident pour le faire

Modifications de chaîne d'agent utilisateur

Pour de nombreux sites Web hérités, certaines des mises à jour les plus visibles pour IE11 Preview impliquent la chaîne d'agent utilisateur. Voici ce qui est signalé pour IE11 Preview sur Windows 8.1 Preview: JavaScript

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv: 11.0) comme Gecko

Comme pour les versions précédentes d'Internet Explorer, des parties de la chaîne d'agent utilisateur varient en fonction de l'environnement. Voici la chaîne pour l'aperçu IE11 sur Windows 7: JavaScript

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv: 11.0) comme Gecko

Si vous comparez ces chaînes à celles signalées par les versions antérieures d'Internet Explorer, vous constaterez les modifications suivantes: Les jetons compatibles ("compatible") et navigateur ("MSIE") ont été supprimés. Le jeton "like Gecko" a été ajouté (par souci de cohérence avec les autres navigateurs). La version du navigateur est maintenant signalée par un nouveau jeton de révision ("rv"). Ces modifications aident à empêcher IE11 Preview d'être (incorrectement) identifié comme une version antérieure. En général, vous devez éviter de détecter des navigateurs ou des versions de navigateur spécifiques. Les hypothèses sous-jacentes à ces tests ont tendance à conduire à des résultats faussement positifs lorsque les navigateurs sont mis à jour. À la place, détectez les fonctionnalités selon vos besoins et utilisez l'amélioration progressive pour offrir des expériences simplifiées aux navigateurs ou aux appareils qui ne prennent pas en charge les fonctionnalités dont vous avez besoin. Dans de rares cas, il peut être nécessaire d'identifier uniquement l'aperçu IE11. Utilisez le jeton Trident pour le faire

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

3
Irvin Dominin

Code plus simple et plus efficace et détectez toutes les versions d'IE/Edge:

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

Le mantra "utiliser la détection des fonctionnalités" me mystifie. Lorsque vous rencontrez un bug, comment pouvez-vous déterminer quelle "fonctionnalité" est le coupable? Prenons par exemple ce bout de code:

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

Il supprime les caractères non numériques du champ de saisie à mesure que l'utilisateur tape. Fonctionne dans FF, Chrome et Safari. Ne fonctionne pas dans N'IMPORTE QUELLE version de IE (jusqu'à 11, au moins): toutes les liaisons suivantes sur le champ de saisie échoueront.

0
Jeff Lowery

J'ai récemment utilisé le code suivant pour détecter IE en général et cela a très bien fonctionné pour IE 11 également

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

L'idée est de rechercher le préfixe vedor.

0
Dhananjay Tomar