Як я можу виявити 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.