Як я можу виявити Internet Explorer (IE) та Microsoft Edge за допомогою JavaScript?


82

Я багато оглядався і розумію, що існує безліч способів виявити Internet Explorer.

Моя проблема полягає в наступному: у моєму документі HTML є область, яка при натисканні викликає функцію JavaScript, яка несумісна з будь-яким видом Internet Explorer. Я хочу виявити, чи використовується IE, і якщо так, встановіть для змінної значення true.

Проблема в тому, що я пишу свій код із Notepad ++, і коли я запускаю HTML-код у браузері, жоден із методів виявлення IE не працює. Я думаю, що проблема в тому, що у мене закінчується Notepad ++. Мені потрібно вміти виявляти IE, щоб на основі змінної я міг вимкнути цю область сайту. Я спробував це:

var isIE10 = false;

if (navigator.userAgent.indexOf("MSIE 10") > -1) {
    // this is internet explorer 10
    isIE10 = true;
   window.alert(isIE10);
}

var isIE = (navigator.userAgent.indexOf("MSIE") != -1);

if(isIE){
    if(!isIE10){
    window.location = 'pages/core/ie.htm';
    }
}

але це не працює. Як я можу виявити IE з Notepad ++? Це те, з чого я тестую HTML, але мені потрібен метод, який буде працювати з цим.

редагувати

Я помітив, що хтось позначив це як дублікат, і це зрозуміло. Припускаю, мені не було ясно. Я не можу використовувати відповідь JQuery, тому це не дублікат, оскільки я прошу ванільної відповіді JS.

Редагувати No2

Чи існує також спосіб виявити браузер Microsoft Edge?


2
Вам буде набагато простіше змусити код працювати в IE та інших браузерах, замість того, щоб писати певний код IE.
Ібу

1
Якщо ви не можете просто виправити свою функцію для роботи в IE, то більшість розглядають функцію набагато кращим способом написання коду, ніж виявлення браузером. Крім того, набагато краща сумісність із перемотуванням, оскільки браузери змінюються. Наприклад, ви вже знаєте, що ви хочете робити з Edge, найновішим браузером Microsoft.
jfriend00

1
можливий дублікат jQuery: перевірте, чи користувач використовує IE, перевірте посилання, є багато рішень
num8er

Якщо одна з відповідей нижче відповідає на ваше запитання, як працює цей сайт, ви "приймете" відповідь, докладніше тут: Що робити, коли хтось відповідає на моє запитання ? Але лише в тому випадку, якщо на ваше запитання дійсно відповіли. Якщо ні, розгляньте можливість додати більше деталей до питання.
baao

До моєї відповіді додано виявлення краю, а також зручне посилання, де ви можете побачити останні версії.
Скептик

Відповіді:


31

Не знаю чому, але я не бачу "Edge" в userAgent, як про всіх інших, тому мені довелося піти іншим шляхом, який може допомогти деяким людям.

Замість того, щоб дивитись на navigator.userAgent, я подивився navigator.appName, щоб розрізнити, чи це IE <= 10 чи IE11 та Edge. IE11 та Edge використовують appName "Netscape", тоді як кожна інша ітерація використовує "Microsoft Internet Explorer".

Після того, як ми визначили, що браузер - це IE11 або Edge, я перейшов до navigator.appVersion. Я помітив, що в IE11 рядок був досить довгим, в ньому було багато інформації. Я довільно вибрав слово "Trident", якого точно немає в навігаторі.appVersion для Edge. Тестування цього слова дозволило мені відрізнити ці два.

Нижче наведено функцію, яка повертає числове значення того, в якому Internet Explorer користувач знаходиться. Якщо на Microsoft Edge він повертає число 12.

Удачі, і я сподіваюся, це допоможе!

function Check_Version(){
    var rv = -1; // Return value assumes failure.

    if (navigator.appName == 'Microsoft Internet Explorer'){

       var ua = navigator.userAgent,
           re  = new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})");

       if (re.exec(ua) !== null){
         rv = parseFloat( RegExp.$1 );
       }
    }
    else if(navigator.appName == "Netscape"){                       
       /// in IE 11 the navigator.appVersion says 'trident'
       /// in Edge the navigator.appVersion does not say trident
       if(navigator.appVersion.indexOf('Trident') === -1) rv = 12;
       else rv = 11;
    }       

    return rv;          
}

7
Це повертає 12 і в edge, і у firefox.
edencorbin

@edencorbin Я розмістив відповідь нижче, яка піклується про цю проблему. stackoverflow.com/a/36688806/2304450
GavinoGrifoni

4
Це не працює. У Chrome, Opera, Firefox та (ймовірно) Safari navigator.appName == "Netscape"вважає істиною.
Джек Гіффін,

2
DITTO. Помилки в Chrome, Opera, Firefox, Safari
BBaysinger

91

Ось останній правильний спосіб, як я знаю, як перевірити IE та Edge:

if (/MSIE 10/i.test(navigator.userAgent)) {
   // This is internet explorer 10
   window.alert('isIE10');
}

if (/MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) {
    // This is internet explorer 9 or 11
    window.location = 'pages/core/ie.htm';
}

if (/Edge\/\d./i.test(navigator.userAgent)){
   // This is Microsoft Edge
   window.alert('Microsoft Edge');
}

Зверніть увагу, що вам не потрібен додатковий var isIE10 у вашому коді, оскільки він виконує дуже конкретні перевірки зараз.

Також ознайомтесь із цією сторінкою щодо останніх рядків агента користувача IE та Edge, оскільки ця відповідь може колись застаріти: https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29. aspx


2
FWIW, коли я перевіряю navigator.userAgentсвою віртуальну машину Win10 / Edge, я отримую лише першу її частину, яка не включає "Edge"рядок.
Dave Newton

1
Яку версію Edge ви використовуєте і чи можете ви опублікувати її тут?
Скептик

Я використовую VirtualBox 5.0.2 r 102096, і зображення називається Microsoft Edge.Win10.For.Mac.VirtualBox.zip, завантажене з сайту MS у понеділок, 27 серпня 2015 р. На робочому столі зображення написано Build 10240 , головна сторінка Edge каже, що я перебуваю на "найновішій версії цієї віртуальної машини, 20150801 ", яка відображається в налаштуваннях як 20.10240.16384.0 .
Дейв Ньютон,

Дякую і рядок navigator.userAgent?
Скептик

1
Він повертається як "Mozilla / 5.0 (Windows NT 10.0; Win64; x64)" замість повного рядка. IIRC Я знайшов ще одне запитання щодо ВМ / зображення.
Dave Newton

36
// detect IE8 and above, and Edge
if (document.documentMode || /Edge/.test(navigator.userAgent)) {
    ... do something
}

Пояснення:

document.documentMode

Властивість лише для IE, вперше доступна в IE8.

/Edge/

Регулярний вираз для пошуку рядка 'Edge' - який ми потім перевіряємо за властивістю 'navigator.userAgent'

Оновлення березня 2020 р

@Jam зауважує, що остання версія Edge тепер повідомляється Edgяк агент користувача. Отже, перевірка буде такою:

if (document.documentMode || /Edge/.test(navigator.userAgent) || /Edg/.test(navigator.userAgent)) {
    ... do something
}

2
Це єдина з цієї сторінки, яка працює для мене як в IE, так і в Edge.
Меломан

1
/Edge\//.test(navigator.userAgent) Щоб зробити більш надійним, я волію включати зворотну скісну риску.
jj

1
В останній версії Edge це просто Edg в користувацькому агенті. Отже, щоб перевірити наявність хрому IE, Edge та Edge, включаючи скісну риску:document.documentMode || /Edge\//.test(navigator.userAgent) || /Edg\//.test(navigator.userAgent)
Jam

Припускаю, вам не потрібно виявляти Edge за допомогою рядка UA "Edg", оскільки він заснований на Chromium і, мабуть, не хотів би його виявляти (на відміну від EdgeHTML)
Андрій

15

Я використовую UAParser https://github.com/faisalman/ua-parser-js

var a = new UAParser();
var name = a.getResult().browser.name;
var version = a.getResult().browser.version;

2
Загалом, виявлення функцій краще, ніж виявлення браузером. Тим не менш, якщо вам дійсно потрібно виявити браузер, я б використовував бібліотеку (як запропоновано тут). Існує багато тонкощів при розборі рядків агента користувача, бібліотека зменшить ризик помилки.
sandstrom

Дуже корисно, жодне з інших рішень не працювало, цей плагін для мене спрацював ідеально.
edencorbin

11

Тема трохи стара, але оскільки тут сценарії виявляють Firefox як помилково позитивний (EDGE v12), ось версія, яку я використовую:

function isIEorEDGE(){
  if (navigator.appName == 'Microsoft Internet Explorer'){
    return true; // IE
  }
  else if(navigator.appName == "Netscape"){                       
     return navigator.userAgent.indexOf('.NET') > -1; // Only Edge uses .NET libraries
  }       

  return false;
}

що, звичайно, можна написати більш стисло:

function isIEorEDGE(){
  return navigator.appName == 'Microsoft Internet Explorer' || (navigator.appName == "Netscape" && navigator.userAgent.indexOf('.NET') > -1);
}

повертає false за край
Збитий вершками літак

@CreamWhippedAirplane чи можете ви опублікувати тут результат навігатора.appName, наданий вашою версією Edge? Можливо, вони нещодавно їх змінили
GavinoGrifoni

@CreamWhippedAirplane, здається, вони змінилися navigator.appVersion: тепер він більше не містить "Trident", але натомість вони належним чином додають "Edge" до назви. Оновлення моєї відповіді прямо зараз!
GavinoGrifoni

Це не спрацювало для мене під час тестування на browserstack.com, я не знаю, чи працює це на справжній машині! Але Netscapeв браузерному стеку я отримав як appName ...
Бетті Сент

4
Помилка для IE 11. IE 11 надає лише „Netscape“ як назву програми, таким чином не
виконуючи

8

Ця функція у мене прекрасно спрацювала. Він також виявляє Edge.

Початково з цього Codepen:

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

/**
 * detect IE
 * returns version of IE or false, if browser is not Internet Explorer
 */
function detectIE() {
  var ua = window.navigator.userAgent;

  // Test values; Uncomment to check result …

  // IE 10
  // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';

  // IE 11
  // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';

  // Edge 12 (Spartan)
  // ua = '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';

  // Edge 13
  // ua = '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';

  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 (IE 12+) => return version number
    return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
  }

  // other browser
  return false;
}

Тоді ви можете використовувати if (detectIE()) { /* do IE stuff */ }у своєму коді.


Це спрацювало для мене в 2019 році. Інші рішення на цій сторінці давали помилково позитивні для Firefox або навіть помилково негативні для IE 11.
Меліса Фрімен

6

Якщо ви просто хочете попередити користувачів, які використовують браузер MS, щось подібне, цей код повинен бути хорошим.

HTML:

<p id="IE">You are not using a microsoft browser</p>

Javascript:

using_ms_browser = navigator.appName == 'Microsoft Internet Explorer' || (navigator.appName == "Netscape" && navigator.appVersion.indexOf('Edge') > -1) || (navigator.appName == "Netscape" && navigator.appVersion.indexOf('Trident') > -1);

if (using_ms_browser == true){
    document.getElementById('IE').innerHTML = "You are using a MS browser"
}

Завдяки @GavinoGrifoni



2

Використовуйте цей фрагмент: var IE = (navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("Trident/7.0") > -1) ? true : false;


3
Це найкраще для мене спрацювало, хоча потрійний опис зайвий. navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("Trident/7.0") > -1обчислює значення true або false, щоб ви могли просто повернути / використати це.
Колбі,

2

Однорядковий код для виявлення браузера.

Якщо браузер IE або Edge, він поверне істину;

let isIE = /edge|msie\s|trident\//i.test(window.navigator.userAgent)

0

Ось клас javascript, який виявляє IE10, IE11 та Edge.
Об'єкт навігатора вводиться для тестування.

var DeviceHelper = function (_navigator) {
    this.navigator = _navigator || navigator;
};
DeviceHelper.prototype.isIE = function() {
    if(!this.navigator.userAgent) {
        return false;
    }

    var IE10 = Boolean(this.navigator.userAgent.match(/(MSIE)/i)),
        IE11 = Boolean(this.navigator.userAgent.match(/(Trident)/i));
    return IE10 || IE11;
};

DeviceHelper.prototype.isEdge = function() {
    return !!this.navigator.userAgent && this.navigator.userAgent.indexOf("Edge") > -1;
};

DeviceHelper.prototype.isMicrosoftBrowser = function() {
    return this.isEdge() || this.isIE();
};

0

Якщо нам потрібно перевірити Edge, зверніться до цього

if (navigator.userAgent.indexOf ("Edge")> 1) {

//do something

}


-4

Перш за все це не проблема Notepad ++ точно. Це ваша " проблема зіставлення рядків "

Загальним рядком у всій версії IE є MSIE. Перевірте різні рядки userAgent за адресою http://www.useragentstring.com/pages/Internet%20Explorer/

if(navigator.userAgent.indexOf("MSIE") != -1){
   alert('I am Internet Explorer!!');
}

спробував це, це не працює. я запустив код із notepad ++ в IE, і попередження не було. Я перевірив консоль налагоджувача, і помилок не було. Я запускаю Windows 7, не впевнений, чи це впливає на версію IE

Яку версію IE ви використовуєте?
Аміт Прабху Паррікар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.