477 votes

Vérifier si l'utilisateur utilise IE

J'appelle une fonction comme celle ci-dessous en cliquant sur les divs avec une certaine classe.

Existe-t-il un moyen de vérifier, lors du lancement de la fonction, si l'utilisateur utilise Internet Explorer et de l'interrompre/annuler s'il utilise d'autres navigateurs, afin que la fonction ne soit exécutée que pour les utilisateurs d'Internet Explorer ? Les utilisateurs ici seraient tous sur IE8 ou des versions supérieures, donc je n'aurais pas besoin de couvrir IE7 et des versions inférieures.

Si je pouvais savoir quel navigateur ils utilisent, ce serait génial mais ce n'est pas obligatoire.

Exemple de fonction :

$('.myClass').on('click', function(event)
{
    // my function
});

0 votes

Voici de nombreux exemples : stackoverflow.com/questions/2400935/

1 votes

Utilisez modernizer pour détecter IE ou d'autres navigateurs. stackoverflow.com/questions/13478303/

0 votes

Veuillez noter qu'avec le développement web moderne, la détection des navigateurs est une mauvaise pratique.

711voto

Mario Points 683

C'est plusieurs années plus tard, et le Le navigateur Edge utilise désormais Chromium comme moteur de rendu.
La vérification pour IE 11 est toujours d'actualité, malheureusement.

Voici une approche plus directe, car les anciennes versions d'IE devraient avoir disparu.

if (window.document.documentMode) {
  // Do IE stuff
}

Voici mon ancienne réponse (2014) :

Dans Edge, le User Agent String a changé.

/**
 * detect IEEdge
 * returns version of IE/Edge or false, if browser is not a Microsoft browser
 */
function detectIEEdge() {
    var ua = window.navigator.userAgent;

    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }

    var trident = ua.indexOf('Trident/');
    if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }

    var edge = ua.indexOf('Edge/');
    if (edge > 0) {
       // Edge => return version number
       return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }

    // other browser
    return false;
}

Exemple d'utilisation :

alert('IEEdge ' + detectIEEdge());

Chaîne par défaut d'IE 10 :

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)

Chaîne par défaut d'IE 11 :

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

Chaîne par défaut de Edge 12 :

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0 

Chaîne par défaut de l'Edge 13 (thx @DrCord) :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 

Chaîne par défaut de Edge 14 :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/14.14300 

Chaîne par défaut de Edge 15 :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063 

Chaîne par défaut de Edge 16 :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 

Chaîne par défaut de Edge 17 :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 

Chaîne par défaut de Edge 18 (Insider preview) :

Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17730 

Test à CodePen :

http://codepen.io/gapcode/pen/vEJNZN

0 votes

Testé dans IE 9 et cela ne fonctionne pas comme écrit. Le problème est que "Trident" est maintenant dans la chaîne ua d'IE9 et est formaté comme ceci : ""Mozilla/5.0 (compatible ; MSIE 9.0 ; Windows NT 6.0 ; Trident/5.0 ; SLCC1 ; .NET CLR 2.0.50727 ; .NET CLR 3.5.30729 ; .NET CLR 3.0.30729 ; .NET4.0C ; .NET4.0E)" ; l'analyse syntaxique a donc échoué et NaN a été renvoyé. Une solution consiste à transformer "if(trident" en "else if(trident". J'ai testé cela sur IE9 et IE11. J'ai pris votre code et mes modifications et les ai fusionnés dans la réponse ici. stackoverflow.com/a/16657946/684852 également.

4 votes

Merci de votre commentaire. Je n'ai pas encore vérifié votre réponse, mais je voudrais faire une remarque : comme le premier "if" contient un "return", vous n'avez pas besoin d'un "else" après.

0 votes

Mais le message suivant s'affiche : "IE a interdit à cette page Web d'exécuter des scripts ou des contrôles Active X". Je dois donc obtenir la permission de l'utilisateur avant de faire quoi que ce soit ?

527voto

SpiderCode Points 3887

Utilisez la méthode JavaScript ci-dessous :

function msieversion() 
{
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0) // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}

Vous pouvez trouver les détails sur le site de support Microsoft ci-dessous :

Comment déterminer la version du navigateur à partir de script

Mise à jour : (support d'IE 11)

function msieversion() {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))  // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}

1 votes

Merci - c'est génial !

31 votes

Bien que cela fonctionnerait bien puisque la variable ua ne commencera jamais avec MSIE, en écrivant if (msie > 0) est trompeuse. Si la valeur n'est pas trouvée, la fonction indexOf() renvoie -1 et non 0. Par conséquent, if (msie > -1) serait plus explicite.

67 votes

Cela renvoie NaN dans IE11, pour moi.

161voto

Dan T Points 121

Si tout ce que vous voulez savoir est si le navigateur est IE ou non, vous pouvez le faire :

var isIE = false;
var ua = window.navigator.userAgent;
var old_ie = ua.indexOf('MSIE ');
var new_ie = ua.indexOf('Trident/');

if ((old_ie > -1) || (new_ie > -1)) {
    isIE = true;
}

if ( isIE ) {
    //IE specific code goes here
}

Mise à jour 1 : Une meilleure méthode

Je le recommande maintenant. Elle est toujours très lisible et représente beaucoup moins de code :)

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  //IE specific code goes here
}

Merci à JohnnyFun dans les commentaires pour la réponse abrégée :)

Mise à jour 2 : Test pour IE dans CSS

Tout d'abord, si vous le pouvez, vous devriez utiliser @supports au lieu de JS pour vérifier si un navigateur prend en charge une certaine fonctionnalité CSS.

.element {
  /* styles for all browsers */
}

@supports (display: grid) {
  .element {
    /* styles for browsers that support display: grid */
  }
}

(Notez que IE ne supporte pas @supports et ignorera tous les styles placés à l'intérieur d'un fichier @supports déclaration.)

Si le problème ne peut être résolu avec @supports alors vous pouvez faire ça :

// JS

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  document.documentElement.classList.add('ie')
}

/* CSS */

.element {
  /* styles that apply everywhere */
}

.ie .element {
  /* styles that only apply in IE */
}

(Note : classList est relativement nouveau pour JS et je pense que, parmi les navigateurs IE, il ne fonctionne que dans IE11. Peut-être aussi IE10).

Si vous utilisez SCSS (Sass) dans votre projet, cela peut être simplifié :

/* SCSS (Sass) */

.element {
  /* styles that apply everywhere */

  .ie & {
    /* styles that only apply in IE */
  }
}

Mise à jour 3 : Ajout de Microsoft Edge (non recommandé)

Si vous souhaitez également ajouter Microsoft Edge dans la liste, vous pouvez procéder comme suit. Cependant, Je ne le recommande pas car Edge est un navigateur beaucoup plus compétent qu'IE.

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident|Edge\//.test(ua);

if ( isIE ) {
  //IE & Edge specific code goes here
}

6 votes

Ou la même chose en quelques octets : ms_ie = ~ua.indexOf('MSIE ') || ~ua.indexOf('Trident/') ; ;-)

12 votes

Ma version a un sens beaucoup plus immédiat pour un humain, mais moins d'octets, c'est toujours bien :)

7 votes

Ou ms_ie = !!ua.match(/MSIE|Trident/)

48voto

bendytree Points 2684

Ce retour true pour toute version d'Internet Explorer :

function isIE(userAgent) {
  userAgent = userAgent || navigator.userAgent;
  return userAgent.indexOf("MSIE ") > -1 || userAgent.indexOf("Trident/") > -1 || userAgent.indexOf("Edge/") > -1;
}

El userAgent Le paramètre est facultatif et la valeur par défaut est l'agent utilisateur du navigateur.

0 votes

Cela devrait être bon, mais vous avez simplement oublié de définir une valeur par défaut "return true" ou "return 1" pour les navigateurs IE. Actuellement, cette fonction ne renvoie aucune valeur lorsque les navigateurs IE sont détectés.

14 votes

Pourquoi vouloir traiter Edge comme IE ? En termes de compatibilité, ils ont peu en commun de nos jours.

1 votes

@docta_faustus userAgent est un paramètre, pas un global

32voto

john Smith Points 3762

Vous pouvez utiliser l'objet navigator pour détecter le user-navigator, vous n'avez pas besoin de jquery pour cela, les 4 commentaires ci-dessous sont déjà inclus donc ce snippet fonctionne comme prévu.

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || navigator.userAgent.indexOf("Trident/") > -1 ){ 
 // Do stuff with Internet-Exploders ... :)
}

http://www.javascriptkit.com/javatutors/navigator.shtml

4 votes

Cela me donne un faux pour mon IE11

2 votes

L'agent utilisateur d'IE11 est différent de celui de MSIE (X.X) ; l'agent utilisateur d'IE11 serait trouvé en vérifiant la présence de Trident.

0 votes

Cela donne un faux positif dans Firefox 45.0.2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X