Je voulais utiliser la bibliothèque Modernizr JS pour détecter certaines propriétés du navigateur afin de déterminer le contenu à afficher ou non.
J'ai une application appelée Pano2VR qui produit à la fois HTML5 et SWF. J'ai besoin du HTML5 pour les utilisateurs d'appareils iOS.
Cependant, IE ne rend pas du tout cette sortie "HTML5". Il semble que leur sortie utilise des transformations 3D CSS3 et WebGL, une ou plusieurs apparemment non prises en charge dans IE9.
Donc, pour ces utilisateurs, j'ai besoin d'afficher la version Flash. J'avais l'intention d'utiliser un IFRAME et de transmettre le SRC via un script Modernizr ou un document.Write le code IFRAME correct en fonction du navigateur.
Tout cela conduit à comment utiliser Modernizr pour détecter simplement IE ou non IE? Ou détecter les transformations CSS 3D?
Ou est-ce qu'il y a un autre moyen de le faire?
la source
Browser identification based on detecting the user agent string is unreliable and is not recommended, as the user agent string is user configurable.
Vous pouvez utiliser Modernizr pour détecter simplement IE ou non IE, en vérifiant SVG SMIL prise en charge de l'animation .
Si vous avez inclus la détection de fonctionnalités SMIL dans votre configuration Modernizr, vous pouvez utiliser une approche CSS simple et cibler la classe .no-smil que Modernizr applique à l' élément html :
html.no-smil { /* IE/Edge specific styles go here - hide HTML5 content and show Flash content */ }
Alternativement, vous pouvez utiliser Modernizr avec une approche JavaScript simple, comme ceci:
if ( Modernizr.smil ) { /* set HTML5 content */ } else { /* set IE/Edge/Flash content */ }
Gardez à l'esprit qu'IE / Edge pourrait un jour prendre en charge SMIL , mais il n'est actuellement pas prévu de le faire.
Pour référence, voici un lien vers le tableau de compatibilité SMIL sur caniuse.com .
la source
Détection des transformations CSS 3D
Modernizr peut détecter les transformations CSS 3D , oui. La véracité de
Modernizr.csstransforms3d
vous dira si le navigateur les prend en charge.Le lien ci-dessus vous permet de sélectionner les tests à inclure dans une version Modernizr, et l'option que vous recherchez y est disponible.
Détecter spécifiquement IE
Alternativement , comme user356990 a répondu, vous pouvez utiliser des commentaires conditionnels si vous recherchez uniquement IE et IE. Plutôt que de créer une variable globale, vous pouvez utiliser l'astuce des
<html>
commentaires conditionnels de HTML5 Boilerplate pour attribuer une classe:<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--> <!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
Si vous avez déjà initialisé jQuery, vous pouvez simplement vérifier avec
$('html').hasClass('lt-ie9')
. Si vous avez besoin de vérifier la version d'IE dans laquelle vous vous trouvez afin de pouvoir charger sous condition jQuery 1.x ou 2.x, vous pouvez faire quelque chose comme ceci:myChecks.ltIE9 = (function(){ var htmlElemClasses = document.querySelector('html').className.split(' '); if (!htmlElemClasses){return false;} for (var i = 0; i < htmlElemClasses.length; i += 1 ){ var klass = htmlElemClasses[i]; if (klass === 'lt-ie9'){ return true; } } return false; }());
NB Les commentaires conditionnels d'IE ne sont pris en charge que jusqu'à IE9 inclus. À partir d'IE10, Microsoft encourage l'utilisation de la détection des fonctionnalités plutôt que de la détection du navigateur.
Quelle que soit la méthode que vous choisissez, vous testerez ensuite avec
if ( myChecks.ltIE9 || Modernizr.csstransforms3d ){ // iframe or flash fallback }
Ne prenez pas cela au
||
pied de la lettre, bien sûr.la source
Si vous recherchez une version JS (utilisant une combinaison de détection de fonctionnalités et de reniflage UA) de ce que faisait le passe-partout html5:
var IE = (!! window.ActiveXObject && +(/msie\s(\d+)/i.exec(navigator.userAgent)[1])) || NaN; if (IE < 9) { document.documentElement.className += ' lt-ie9' + ' ie' + IE; }
la source
Eh bien, après avoir fait plus de recherches sur ce sujet, j'ai fini par utiliser la solution suivante pour cibler IE 10+. Comme IE10 et 11 sont les seuls navigateurs qui prennent en charge la requête multimédia -ms-high-contrast, c'est une bonne option sans JS:
@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) { /* IE10+ specific styles go here */ }
Fonctionne parfaitement.
la source
Les astuces CSS ont une bonne solution pour cibler IE 11:
http://css-tricks.com/ie-10-specific-styles/
Le .NET et Trident / 7.0 sont uniques à IE et peuvent donc être utilisés pour détecter la version 11 d'IE.
Le code ajoute ensuite la chaîne de l'agent utilisateur à la balise html avec l'attribut 'data-useragent', de sorte que IE 11 peut être ciblé spécifiquement ...
la source
J'avais besoin de détecter IE par rapport à presque tout le reste et je ne voulais pas dépendre de la chaîne UA. J'ai trouvé qu'en utilisant
es6number
avec Modernizr faisait exactement ce que je voulais. Je ne suis pas très préoccupé par ce changement car je ne m'attends pas à ce qu'IE prenne jamais en charge le numéro ES6. Alors maintenant, je connais la différence entre n'importe quelle version d'IE vs Edge / Chrome / Firefox / Opera / Safari.Plus de détails ici: http://caniuse.com/#feat=es6-number
Notez que je ne suis pas vraiment préoccupé par les faux négatifs d'Opera Mini. Tu pourrais être.
la source
Vous pouvez utiliser le
< !-- [if IE] >
hack pour définir une variable js globale qui sera ensuite testée dans votre code js normal. Un peu moche mais cela a bien fonctionné pour moi.la source