Определить версию IE (до версии v9) в JavaScript
Я хочу отбросить пользователей нашего веб-сайта на страницу с ошибкой, если они используют версию Internet Explorer
до v9. Это просто не стоит нашего времени и денег для поддержки IE pre-v9
. Пользователи всех других браузеров, отличных от IE, в порядке и не должны отскакивать. Здесь предлагается код:
if(navigator.appName.indexOf("Internet Explorer")!=-1){ //yeah, he using IE
var badBrowser=(
navigator.appVersion.indexOf("MSIE 9")==-1 && //v9 is ok
navigator.appVersion.indexOf("MSIE 1")==-1 //v10, 11, 12, etc. is fine too
);
if(badBrowser){
// navigate to error page
}
}
Будет ли этот код делать трюк?
Чтобы отбросить несколько комментариев, которые, вероятно, будут на моем пути:
- Да, я знаю, что пользователи могут подделать свою строку
useragent
. Меня это не касается.
- Да, я знаю, что программисты предпочитают обнюхивать поддержку функций вместо типа браузера, но я не чувствую, что этот подход имеет смысл в этом случае. Я уже знаю, что все (релевантные) браузеры, отличные от IE, поддерживают функции, которые мне нужны, и что все браузеры
pre-v9 IE
этого не делают. Проверка функции по функциям на всем сайте будет пустой тратой.
- Да, я знаю, что кто-то, пытающийся получить доступ к сайту с помощью
IE v1
(или >= 20), не получит значение "badBrowser" равным true, и страница с предупреждением будет отображаться неправильно. Это риск, который мы готовы принять.
- Да, я знаю, что Microsoft имеет "условные комментарии", которые могут использоваться для точного определения версии браузера. IE больше не поддерживает условные комментарии от
IE 10
, делая этот подход абсолютно бесполезным.
Любые другие очевидные проблемы, о которых нужно знать?
Ответы
Ответ 1
Это мой предпочтительный способ сделать это. Это дает максимальный контроль. (Примечание. Условные операторы поддерживаются только в IE5-9.)
Сначала правильно настройте свои классы.
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->
<head>
Затем вы можете просто использовать CSS для создания исключений стиля, или, если потребуется, вы можете добавить простой JavaScript:
(function ($) {
"use strict";
// Detecting IE
var oldIE;
if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
oldIE = true;
}
if (oldIE) {
// Here your JS for IE..
} else {
// ..And here the full-fat code for everyone else
}
}(jQuery));
Благодаря Paul Irish.
Ответ 2
Вернуть версию IE или если IE не возвращает false
function isIE () {
var myNav = navigator.userAgent.toLowerCase();
return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}
Пример:
if (isIE () == 8) {
// IE8 code
} else {
// Other versions IE or not IE
}
или
if (isIE () && isIE () < 9) {
// is IE version less than 9
} else {
// is IE 9 and later or not IE
}
или
if (isIE()) {
// is IE
} else {
// Other browser
}
Ответ 3
Если никто не добавил метод addEventLister
, и вы используете правильный режим браузера, вы можете проверить IE 8 или менее с помощью
if (window.attachEvent && !window.addEventListener) {
// "bad" IE
}
Устаревший Internet Explorer и attachEvent (MDN)
Ответ 4
Используйте условные комментарии. Вы пытаетесь обнаружить пользователей IE < 9 и условные комментарии будут работать в этих браузерах; в других браузерах (IE >= 10 и не-IE) комментарии будут рассматриваться как обычные HTML-комментарии, что и есть они.
Пример HTML:
<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->
Вы также можете сделать это с помощью script, если вам нужно:
var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
alert("WE DON'T LIKE YOUR BROWSER");
}
Ответ 5
Легко обнаружить MSIE (v6 - v7 - v8 - v9 - v10 - v11):
if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
// MSIE
}
Ответ 6
Чтобы надежно фильтровать IE8 и старше, проверка глобальных объектов можно использовать:
if (document.all && !document.addEventListener) {
alert('IE8 or lower');
}
Ответ 7
Вот как AngularJS проверяет для IE
/**
* documentMode is an IE-only property
* http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
*/
var msie = document.documentMode;
if (msie < 9) {
// code for IE < 9
}
Ответ 8
Эта функция вернет основной номер версии IE в виде целого числа или undefined
, если браузер не является Internet Explorer. Это, как и все решения для пользовательских агентов, является приемлемым для подмены пользовательского агента (который был официальной особенностью IE с версии 8).
function getIEVersion() {
var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
return match ? parseInt(match[1]) : undefined;
}
Ответ 9
Обнаружение IE в JS с использованием условных комментариев
// ----------------------------------------------------------
// 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;
}());
Ответ 10
Это работает для меня. Я использую его как перенаправление на страницу, которая объясняет, почему нам не нравится < IE9 и предоставлять ссылки на браузеры, которые мы предпочитаем.
<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
Ответ 11
Обнаружение версии IE с использованием обнаружения функции (IE7 +, браузеры до IE7 обнаруживаются как 7):
var ie = (function (){
if (window.ActiveXObject === undefined) return null;
if (!document.querySelector) return 7;
if (!document.addEventListener) return 8;
if (!window.atob) return 9;
if (!document.__proto__) return 10;
return 11;
})();
Изменить: я создал репозиторий bower/npm для вашего удобства: ie-version
Ответ 12
Ваш код может выполнить проверку, но, как вы думали, если кто-то попытается получить доступ к вашей странице с помощью IE v1 или > v19, это не приведет к ошибке, поэтому может быть более безопасно выполнить проверку с выражением Regex, как этот код ниже:
var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) &&
parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
// Navigate to error page
}
Ответ 13
Условные комментарии больше не поддерживаются в IE начиная с версии 10, как указано на справочной странице Microsoft.
var ieDetector = function() {
var browser = { // browser object
verIE: null,
docModeIE: null,
verIEtrue: null,
verIE_ua: null
},
tmp;
tmp = document.documentMode;
try {
document.documentMode = "";
} catch (e) {};
browser.isIE = typeof document.documentMode == "number" || eval("/*@[email protected]*/!1");
try {
document.documentMode = tmp;
} catch (e) {};
// We only let IE run this code.
if (browser.isIE) {
browser.verIE_ua =
(/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
parseFloat(RegExp.$1, 10) : null;
var e, verTrueFloat, x,
obj = document.createElement("div"),
CLASSID = [
"{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
"{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
"{89820200-ECBD-11CF-8B85-00AA005B4383}"
];
try {
obj.style.behavior = "url(#default#clientcaps)"
} catch (e) {};
for (x = 0; x < CLASSID.length; x++) {
try {
browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
} catch (e) {};
if (browser.verIEtrue) break;
};
verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
browser.docModeIE = document.documentMode ||
((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
browser.verIE_ua;
browser.verIE = verTrueFloat || browser.docModeIE;
};
return {
isIE: browser.isIE,
Version: browser.verIE
};
}();
document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);
Ответ 14
То есть 10 и 11:
Вы можете использовать js и добавить класс в html для поддержания стандарта условных комментариев:
var ua = navigator.userAgent,
doc = document.documentElement;
if ((ua.match(/MSIE 10.0/i))) {
doc.className = doc.className + " ie10";
} else if((ua.match(/rv:11.0/i))){
doc.className = doc.className + " ie11";
}
Или используйте lib, как bowser:
https://github.com/ded/bowser
Или модерн для обнаружения функции:
http://modernizr.com/
Ответ 15
Чтобы обнаружить Internet Explorer 10 | 11, вы можете использовать этот маленький script сразу после тега body:
В моем случае я использую библиотеку jQuery, загруженную в голову.
<!DOCTYPE HTML>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
<script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
Ответ 16
Это ответит на смерть, но это все, что вам нужно.
!!navigator.userAgent.match(/msie\s[5-8]/i)
Ответ 17
var Browser = new function () {
var self = this;
var nav = navigator.userAgent.toLowerCase();
if (nav.indexOf('msie') != -1) {
self.ie = {
version: toFloat(nav.split('msie')[1])
};
};
};
if(Browser.ie && Browser.ie.version > 9)
{
// do something
}
Ответ 18
В соответствии с Microsoft следующее наилучшее решение, это также очень просто:
function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
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;
}
function checkVersion()
{
var msg = "You're not using Internet Explorer.";
var ver = getInternetExplorerVersion();
if ( ver > -1 )
{
if ( ver >= 8.0 )
msg = "You're using a recent copy of Internet Explorer."
else
msg = "You should upgrade your copy of Internet Explorer.";
}
alert( msg );
}
Ответ 19
Я порекомендую не переписывать этот код в первый раз. Я бы порекомендовал вам использовать библиотеку Conditionizr (http://conditionizr.com/), которая способна тестировать определенные версии IE, а также другие браузеры, операционные системы, и даже наличие или отсутствие дисплеев Retina.
Включите код только для конкретных тестов, которые вам нужны, а также получите пользу тестируемой библиотеки, которая прошла через множество итераций (и которая будет легко обновляться без нарушения кода).
Он также прекрасно сочетается с Modernizr, который может обрабатывать все те случаи, когда вам лучше тестировать определенные функции, а не конкретный браузер.
Ответ 20
Мне нравится:
<script>
function isIE () {
var myNav = navigator.userAgent.toLowerCase();
return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}
var ua = window.navigator.userAgent;
//Internet Explorer | if | 9-11
if (isIE () == 9) {
alert("Shut down this junk! | IE 9");
} else if (isIE () == 10){
alert("Shut down this junk! | IE 10");
} else if (ua.indexOf("Trident/7.0") > 0) {
alert("Shut down this junk! | IE 11");
}else{
alert("Thank god it not IE!");
}
</script>
Ответ 21
Этот подход к обнаружению IE объединяет сильные стороны и позволяет избежать слабых сторон ответа jKey с использованием условных комментариев и ответа Owen с использованием пользовательских агентов.
-
Подход
- jKey работает до версии 9 и невосприимчив к спуфингу пользовательского агента в IE 8 и 9.
-
Подход Owen может терпеть неудачу в IE 5 и 6 (отчет 7) и восприимчив к спуфированию UA, но он может обнаруживать версии IE >= 10 (теперь также включает 12, которые отправляют ответ Owen).
// ----------------------------------------------------------
// A short snippet for detecting versions of IE
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ----------------------------------------------------------
var ie = (function(){
var v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while (
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
if (v <= 4) { // Check for IE>9 using user agent
var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
v = match ? parseInt(match[1]) : undefined;
}
return v;
}());
Это можно использовать для установки полезных классов в ваш документ, содержащий версию IE:
if (ie) {
document.documentElement.className += ' ie' + ie;
if (ie < 9)
document.documentElement.className += ' ieLT9';
}
Обратите внимание, что он определяет используемый режим совместимости, если IE находится в режиме совместимости. Также обратите внимание, что версия IE в основном полезна для более старых версий (< 10); более высокие версии более совместимы со стандартами, и, вероятно, лучше вместо этого проверять функции, используя что-то вроде modernizr.js.
Ответ 22
Я сделал для этого удобный знак подчеркивания.
_.isIE(); // Any version of IE?
_.isIE(9); // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?
_.mixin({
isIE: function(mixed) {
if (_.isUndefined(mixed)) {
mixed = [7, 8, 9, 10, 11];
} else if (_.isNumber(mixed)) {
mixed = [mixed];
}
for (var j = 0; j < mixed.length; j++) {
var re;
switch (mixed[j]) {
case 11:
re = /Trident.*rv\:11\./g;
break;
case 10:
re = /MSIE\s10\./g;
break;
case 9:
re = /MSIE\s9\./g;
break;
case 8:
re = /MSIE\s8\./g;
break;
case 7:
re = /MSIE\s7\./g;
break;
}
if (!!window.navigator.userAgent.match(re)) {
return true;
}
}
return false;
}
});
console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Ответ 23
Самый полный JS script, который я нашел для проверки версий IE, http://www.pinlady.net/PluginDetect/IE/. Вся библиотека находится в http://www.pinlady.net/PluginDetect/Browsers/.
В IE10 условные утверждения больше не поддерживаются.
В IE11 пользовательский агент больше не содержит MSIE. Кроме того, использование пользовательского агента не является надежным, поскольку оно может быть изменено.
Используя PluginDetect JS script, вы можете обнаружить IE и определить точные версии, используя очень специфичный и хорошо продуманный код, предназначенный для конкретных версий IE. Это очень полезно, когда вы заботитесь о том, в какой версии браузера вы работаете.
Ответ 24
Я понимаю, что я немного опаздываю на вечеринку здесь, но я проверял простой способ с одной строкой, чтобы предоставить отзыв о том, является ли браузер IE и какой версией он был от 10 до этого. Я не кодировал это для версии 11, поэтому, возможно, потребуется небольшая поправка.
Однако это код, он работает как объект, обладающий свойством и методом, и полагается на обнаружение объекта, а не на соскребание объекта навигатора (что является массовым недостатком, поскольку его можно подделать).
var isIE = { browser:/*@[email protected]*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };
Использование isIE.browser
свойство, возвращающее логическое значение, и полагается на условные комментарии методом isIE.detectedVersion()
, который возвращает число от 5 до 10. Я делаю предположение, что все, что ниже 6, и вы находитесь в серьезном старом и вы будете чем-то более мясистым, чем один лайнер и что-нибудь большее, чем 10, и вы попадете на более новую территорию. Я кое-что прочитал о том, что IE11 не поддерживает условные комментарии, но я не полностью исследовал это, возможно, на более позднюю дату.
В любом случае, как и в случае с одним лайнером, он расскажет об основах браузера IE и определения версии. Это далеко не идеально, но оно мало и легко дополняется.
Просто для справки, и если кто-то сомневается в том, как реально реализовать это, то следующее условие должно помочь.
var isIE = { browser:/*@[email protected]*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };
/* testing IE */
if (isIE.browser) {
alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
Ответ 25
Обнаружение IE и его версий не может быть проще, и все, что вам нужно, это немного родной/ванильный Javascript:
var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;
if (uA.indexOf('MSIE 6') >= 0) {
browser = 'IE';
ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
browser = 'IE';
ieVersion = 7;
}
if (document.documentMode) { // as of IE8
browser = 'IE';
ieVersion = document.documentMode;
}
И это способ его использования:
if (browser == 'IE' && ieVersion <= 9)
document.documentElement.className += ' ie9-';
.
Работает во всех версиях IE, включая более высокие версии в более низком представлении/режиме совместимости, и documentMode
является собственностью IE.
Ответ 26
Если вам нужно отменить версию браузера IE, вы можете следовать ниже кода. Этот код хорошо работает для версии IE6 для IE11
<!DOCTYPE html>
<html>
<body>
<p>Click on Try button to check IE Browser version.</p>
<button onclick="getInternetExplorerVersion()">Try it</button>
<p id="demo"></p>
<script>
function getInternetExplorerVersion() {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
var rv = -1;
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number
{
if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
//For IE 11 >
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);
alert(rv);
}
}
else {
alert('otherbrowser');
}
}
else {
//For < IE11
alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
}
return false;
}}
</script>
</body>
</html>
Ответ 27
Запуск окон IE10 будет автоматически обновляться до IE11 + и будет стандартизован W3C
В настоящее время нам не нужно поддерживать IE8 -
<!DOCTYPE html>
<!--[if lt IE 9]><html class="ie ie8"><![endif]-->
<!--[if IE 9]><html class="ie ie9"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
<head>
...
<!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
...
</head>
Ответ 28
var isIE9OrBelow = function()
{
return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
Ответ 29
if (!document.addEventListener) {
// ie8
} else if (!window.btoa) {
// ie9
}
// others
Ответ 30
// Detect ie <= 10
var ie = /MSIE ([0-9]+)/g.exec(window.navigator.userAgent)[1] || undefined;
console.log(ie);
// Return version ie or undefined if not ie or ie > 10