Comment détecter IE 11 avec javascript en Asp.net
Bonjour, je veux détecter le Navigateur , c'est à dire 8 ou plus approprié pour moi. Pour cela j'ai utilisé le code suivant mais il échoue pour IE 11 . Pour d'autres de ses détecter 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.);
}
return rv;
}
ci-dessous est le lien que j'ai également essayé mais n'a pas réussi.
10 réponses
NE FAITES PAS DE DÉTECTION DE NAVIGATEUR! Il va se casser, et il va vous causer des problèmes.
IE11 a une chaîne D'Agent utilisateur complètement différente des versions précédentes D'IE; elle n'inclut plus le texte" MSIE". C'est pourquoi votre code de détection ne fonctionne pas.
il est important de noter ici que la raison pour laquelle ils ont fait cela était délibérée. Ils voulais pour casser les scripts de détection de navigateur comme celui-ci.
il est possible de changer votre code en travailler avec IE11, mais je recommande fortement de ne pas le faire, car vous aurez probablement le même problème encore une fois lorsque IE12 sort.
alors pourquoi voulaient-ils casser les scripts de détection de navigateur? Simple: parce que IE11 n'a pas les bogues des versions précédentes, et il a beaucoup de nouvelles fonctionnalités. Donc, si vous faites la détection de navigateur parce QU'IE a certains bugs ou fonctionnalités manquantes et vous avez le code pour corriger ces problèmes basés sur le navigateur détecter, alors ce code pourrait effectivement causer des problèmes plus graves dans IE11 où les correctifs ne sont pas nécessaires.
IE11 a cassé votre script, mais la même logique s'applique à tous les navigateurs et à toutes les versions; détecter le navigateur et la version est presque toujours la mauvaise chose à faire.
S'il y a des fonctionnalités spécifiques que vous voulez prendre en charge, mais qui sont manquantes dans les versions plus anciennes de IE (ou d'autres navigateurs plus anciens), n'utilisez pas la détection de navigateur pour le résoudre; vous devez utiliser détection des caractéristiques plutôt.
détection de fonctionnalités signifie vérifier le navigateur pour voir s'il supporte les fonctionnalités particulières que vous souhaitez utiliser. La façon la plus courante de le faire est d'utiliser la méthode Modernizr bibliothèque. Les docs sur leur site vous guideront tout au long de sa mise en place.
il y a quelques bugs dans les versions plus anciennes D'IE qui sont difficiles à détecter, et pour ces quelques cas, il est valide d'utiliser la détection de navigateur en dernier recours, mais ces cas sont vraiment seulement pour IE6 et antérieur. Peut-être, parfois, pour IE7. Mais vous avez déclaré dans la question que vous ne regardez IE8 et plus tard, de sorte que cela ne devrait pas s'appliquer.
S'en tenir à la détection de fonctionnalités; c'est plus fiable, meilleure pratique, et ne se cassera pas soudainement quand une nouvelle version de navigateur est publiée.
vous pouvez explicitement détecter IE11 avec la vérification suivante (en utilisant détection des caractéristiques):
if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
// is IE11
}
explication: toutes les versions de IE (sauf les plus anciennes) ont window.ActiveXObject
propriété présente. IE11, cependant, cache cette propriété de DOM et cette propriété est maintenant indéterminée. Mais la propriété elle-même est présente dans l'objet, donc vérifier la présence de la propriété renvoie true dans toutes les versions D'IE, mais dans IE11 elle renvoie aussi false pour la seconde vérification.
Et, enfin, hasOwnProperty
est appelée par l'Objet, parce que dans IE8 (et je crois que plus tôt) window
n'est pas instanceof Object
et n'a pas hasOwnProperty
méthode.
une Autre méthode, utilisation de 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);
ceci détectera toute version D'IE si sa chaîne userAgent n'a pas été mystifiée.
il y a de très rares cas où vous avez réellement besoin d'utiliser la détection de navigateur comme décrit ci-dessus. dans la plupart des cas, l'approche de détection des caractéristiques est préférable.
Utiliser !(window.ActiveXObject) && "ActiveXObject" in window
pour détecter IE11 explicitement.
Pour détecter toute version de IE, utilisez window.ActiveXObject || "ActiveXObject" in window
à la place.
comme déjà indiqué-ne pas faire la détection de navigateur, plutôt faire la détection de fonctionnalité. Cependant, comme je vois votre script est une version plus ancienne d'un script qui circule ici. C'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. );
}
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. );
}
return rv;
}
qui Est mieux pour vous si vous évitez la détection du navigateur; si vous avez besoin ici, c'est une bonne expliquer à partir de MS de l'équipe:
dans de rares cas, il peut être nécessaire d'identifier de façon unique la prévisualisation IE11. Utilisez le Trident
jeton de le faire
chaîne de l'agent Utilisateur changements
http://msdn.microsoft.com/en-us/library/ie/bg182625 (v=vs 85).aspxpour de nombreux sites Web patrimoniaux, certains des plus les mises à jour visibles pour L'aperçu IE11 impliquent la chaîne user-agent. Voici ce qui est rapporté pour IE11 Preview sur Windows 8.1 Preview: JavaScript
Mozilla / 5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
comme avec les versions précédentes D'Internet Explorer, des parties de user-agent chaîne de varier en fonction de l'environnement. Voici la corde pour IE11 Aperçu sur Windows 7: JavaScript
Mozilla / 5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
si vous comparez ces chaînes à celles rapportées par les versions précédentes D'Internet Explorer, vous trouverez ce qui suit changements: les jetons compatibles ("compatible") et les jetons de navigateur ("MSIE") ont été retiré. Le jeton "like Gecko" a été ajouté (pour la 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 prévisualiser De être (incorrectement) identifié comme une version antérieure. En général, vous devrait éviter de détecter des navigateurs spécifiques ou des versions de navigateur. Le les hypothèses sous-jacentes à ces tests ont tendance à conduire à des faux positifs résultats lorsque les navigateurs sont mis à jour. Au lieu de cela, détectez les traits que vous besoin d'eux et d'utiliser l'amélioration progressive pour fournir simplifié expériences pour les navigateurs ou les périphériques qui ne prennent pas en charge les fonctionnalités vous avez besoin d'. Dans de rares cas, il peut s'avérer nécessaire d'identifier de façon unique IE 11 Aperçu. Utilisez le jeton Trident pour le faire
plus facile et efficace de code et de détecter toutes les versions D'IE / Edge:
if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}
j'ai récemment utilisé le code suivant pour détecter IE en général et il a fonctionné très bien pour IE 11 aussi bien
var bs = document.body.style, isIE=false;
if ('msTransition' in bs) {
isIE = true;
}
L'idée est de chercher vedor préfixe.
le mantra "use feature detection" me mystifie. Quand vous rencontrez un bug, comment pouvez-vous déterminer quelle option est la coupable? Prenez par exemple ce morceau 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 d'entrée au fur et à mesure que l'utilisateur tape. Fonctionne en FF, Chrome et Safari. Ne fonctionne dans aucune version de IE (jusqu'à 11, au moins): toute liaison ultérieure sur le champ input échouera.
detect de fonctionnalité, detect de fonctionnalité, detect de fonctionnalité
<script>
if (!('querySelector' in document) //this should work in ie 9+
|| !('localStorage' in window) //ie 8+
|| !('addEventListener' in window) //ie 8 + (I think)
|| !('matchMedia' in window)) {//ie 10+
//do your redirect here
}
</script>