Afin de détecter IE, la plupart des librairies Javascript font toutes sortes d’astuces.
YAHOO.env.ua = function()
(fichier yahoo.js
)Après avoir lu cette réponse , je me suis dit que c’était vrai. Pour détecter simplement IE en Javascript, nous pourrions simplement ajouter à nos pages:
<!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]-->
<script type="text/javascript" src="all-your-other-scripts-here.js"></script>
Maintenant, la variable window.isIE
est définie pour tout notre code Javascript, en effectuant simplement:
if(window.isIE)
...
En plus du fait que cela risque d’être pénible, car il doit être ajouté à toutes les pages, existe-t-il des problèmes/considérations que je pourrais ignorer?}
FYI: Je sais qu'il est préférable d'utiliser la détection d'objet plutôt que la détection de navigateur , mais il existe des cas où vous devez toujours utiliser la détection de navigateur.
James Padolsey a mis un petit extrait sur GitHub que je vais citer ici:
// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
// UPDATE: Now using Live NodeList idea from @jdalton
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;
}());
Bien sûr, tous les crédits devraient aller à James, je ne suis que le messager (mais s'il vous plaît, tirez sur le messager si mon copier-coller a été une erreur).
Regardez aussi les fourchettes qui ont été créées. Paul Irish a expliqué le fonctionnement interne dans un commentaire .
Si vous voulez le faire de cette façon, je pense qu'il est bien préférable d'utiliser la compilation conditionnelle, car vous pouvez le faire dans le javascript sans avoir besoin de changer le code HTML:
var isIE = /*@cc_on!@*/false;
La réponse de Marcel Korpel ne fonctionne plus (dans IE 10, elle retourne undef, de sorte que IE 10 apparaît comme n'étant pas IE). REMARQUE: Maintenant mis à jour pour fonctionner avec IE 11 également.
Ceci est une variante de ce code, mais qui provient de recommandations de Microsoft . Si vous utilisiez le code précédent, vous pouvez simplement ajouter ce remplacement car il est conçu pour être appelé exactement de la même manière.
Contrairement aux commentaires conditionnels/compilation, cela devrait également fonctionner correctement avec les minimiseurs.
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9, IE10 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
var ie = (function(){
var undef,rv = -1; // Return value assumes failure.
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE ');
var trident = ua.indexOf('Trident/');
if (msie > 0) {
// IE 10 or older => return version number
rv = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
} else if (trident > 0) {
// IE 11 (or newer) => return version number
var rvNum = ua.indexOf('rv:');
rv = parseInt(ua.substring(rvNum + 3, ua.indexOf('.', rvNum)), 10);
}
return ((rv > -1) ? rv : undef);
}());
mis à jour pour fonctionner avec IE11. Merci à «acarlon» de m'avoir signalé que cela ne fonctionnait pas et à «mario» pour le code sur lequel j'ai basé le correctif!
Internet Explorer 11 a beaucoup changé et de nombreuses méthodes de détection de navigateur antérieures ne fonctionnent plus. Le code ci-dessous fonctionne pour IE 11 et les versions antérieures.
function isIE()
{
var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1;
var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1;
return isIE11orLess;
}
Je pense avoir ce que vous cherchez. Vous pouvez obtenir la version complète d'Internet Explorer sous la forme d'une chaîne "AA.BB.CCCC.DDDD" à l'aide de Javascript et de clientCaps.
http://www.pinlady.net/PluginDetect/IE/
Il semble fonctionner pour IE 5.5 et versions ultérieures (y compris IE 10) . Il est immunisé contre le mode navigator.userAgent/document/browser. des commentaires, ou des éléments HTML supplémentaires. C'est une solution pure Javascript.
Je ne suis pas encore sûr du comportement de IE Mobile, mais vous pouvez toujours utiliser une méthode de détection de sauvegarde en cas d'échec de cette méthode clientCaps.
Jusqu'ici, je dois dire que cela fonctionne plutôt bien.
Je pense que vous avez répondu à votre propre question: tout d’abord, il ne détecte qu’IE, le script diviserait donc l’univers des navigateurs en deux parties: IE et <everythingelse>.
Deuxièmement, vous devez ajouter un commentaire farfelu à chaque page HTML. Étant donné que de nombreuses bibliothèques JavaScript, telles que jQuery et YUI, doivent être "faciles" à insérer/utiliser pour une multitude de sites, vous les rendriez automatiquement plus difficiles à utiliser en dehors du portail.
navigator.userAgent
existe si la détection du navigateur (plutôt que la détection des fonctionnalités) est vraiment nécessaire et jQuery l'utilise pour obtenir les informations relatives à l'objet $.browser
. C'est bien plus agréable que de devoir inclure un commentaire conditionnel spécifique à IE dans every page.
Vous trouverez ici quelques astuces très simples pour la détection de navigateur: http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/
var isIE = IE='\v'=='v';
J'utilise ce code
var isIE = navigator.userAgent.indexOf ('MSIE')> -1;
var version = navigator.userAgent.match(/(msie) (\d+)/i);
console.log(version);
quelque chose de rapide que j'ai écrit rapidement après avoir examiné cette question au cas où quelqu'un le voudrait.
** MODIFIER **
Par le commentaire _ {de Johnny Darvall} ci-dessous, j'ajoute un lien pour tous ceux qui essaient de repérer Internet Explorer 11:
La vérification des navigateurs est une mauvaise idée - il vaut mieux vérifier le navigateur caractéristiques à la place. Par exemple, vous vérifiez généralement si l'utilisateur utilise IE parce que vous souhaitez utiliser une fonctionnalité non prise en charge dans IE. Cependant, savez-vous que TOUS les navigateurs actuels et futurs non-IE prendront en charge cette fonctionnalité? Non . Ainsi, le chemin, par exemple jQuery est mieux utilisé: il crée et exécute de petits cas de test vérifiant certains bogues/fonctionnalités - et vous pouvez simplement vérifier des éléments tels que if (browser_supports_XYZ) au lieu de vérifier si l'utilisateur utilise un navigateur spécifique.
Quoi qu'il en soit, il est toujours nécessaire de rechercher le navigateur, car il s'agit d'un bug visuel que vous ne pouvez pas tester avec un script. Dans ce cas, il est préférable d’utiliser javascript plutôt que des commentaires conditionnels, car le navigateur vérifie à l’endroit où vous en avez besoin plutôt qu’à un autre endroit (imaginez un fichier .js où vous recherchez isIE, qui n’est jamais défini dans ce fichier. )
Pour mon cas d’utilisation, j’ai juste besoin de détecter s’il est inférieur à IE9, j’utilise donc
if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1)
{
//IE8- stuff
}