Bagaimana cara mendeteksi IE11?

212

Ketika saya ingin mendeteksi IE saya menggunakan kode ini:

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.$1 );
  }
  return rv;
}
function checkVersion()
{
  var msg = "You're not using Internet Explorer.";
  var ver = getInternetExplorerVersion();

  if ( ver > -1 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

Tetapi IE11 mengembalikan "Anda tidak menggunakan Internet Explorer". Bagaimana saya bisa mendeteksinya?

Paul Sweatte
sumber
1
Apa pun berdasarkan agen pengguna cacat. Terlalu mudah untuk dipalsukan, Sekarang, mungkin ini bukan masalah, tetapi bagi saya skrip pendeteksi browser seharusnya memiliki peluang yang adil untuk mendeteksi penyamaran. Saya menggunakan kombinasi komentar bersyarat, gagal untuk mencoba memaksa dokumen.documentMode dan kemudian melihat window.MSInputMethodContext seperti yang ditulis Paul Sweatte di bawah ini. Saya akan memposting kode saya tetapi mencambuk kuda mati.
David G
3
IE11 memiliki agen-pengguna: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) seperti jenis Tokek Os: 6.1 - win7, 6.3 - win81
silet
1
lihat jawaban saya di sini stackoverflow.com/questions/21825157/...
Royi Namir
1
inilah solusi terbaik yang saya temukan: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// is IE11}
xorcus

Jawaban:

221

IE11 tidak lagi melaporkan sebagai MSIE, menurut daftar perubahan ini sengaja untuk menghindari salah deteksi.

Apa yang dapat Anda lakukan jika Anda benar - benar ingin tahu itu adalah untuk mendeteksi Trident/string di agen pengguna jika navigator.appNamekembali Netscape, sesuatu seperti (yang belum diuji);

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.$1 );
  }
  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.$1 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());

Perhatikan bahwa IE11 (afaik) masih dalam pratinjau, dan agen pengguna dapat berubah sebelum rilis.

Joachim Isaksson
sumber
81
it's intentional to avoid mis-detection- Sayangnya, sekarang bahwa IE11 dilepaskan, kita memiliki kode yang rusak di hanya IE11, sedangkan deteksi benar IE akan bekerja ...
Izkata
68
Saya mengonversi solusi ini ke Boolean jika versinya kurang pentingfunction isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
rg89
6
@ lzkata - Per spec html5 di sini , IE sebenarnya mengikuti standar. Jadi ya, ini disengaja, tetapi ini sesuai dengan standar baru (mencabut api html lama.)
Mark Avenius
11
"Alasan mereka melakukan ini adalah disengaja. Mereka ingin memecahkan skrip deteksi browser seperti ini." dari stackoverflow.com/a/18872067/1066234 ... Sebenarnya seharusnya: 'Mereka ingin membuat miliar situs web rusak seperti ini.'
Kai Noack
15
Ini berfungsi untuk saya: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); source
Kai Noack
86

Gunakan !(window.ActiveXObject) && "ActiveXObject" in windowuntuk mendeteksi IE11 secara eksplisit.

Untuk mendeteksi versi IE (pra-Edge, "Trident"), gunakan "ActiveXObject" in window.

mcw
sumber
2
Artikel Microsoft ini menyarankan solusi ini mungkin tidak lagi berfungsi msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
5
Sebenarnya, artikel ini menjelaskan alasan mengapa metode saya berfungsi. Mencoba mengakses window.ActiveXObject, seperti yang dijelaskan dalam artikel, kembali undefineddi IE11 sekarang (dan juga browser non-Microsoft.) Pengujian menggunakan inoperator javascript kembali truedi semua browser Microsoft, jadi keduanya adalah kasus ketat di IE11. Jika Microsoft mengeluarkan perubahan pada perilaku inoperator, ya, metode ini akan rusak.
mcw
5
"ActiveXObject" di jendela mengembalikan False in Edge.
Neo
8
@Neo Edge bukan IE, pertanyaan OP adalah bagaimana mendeteksi
IE11
1
@ Majazi ya tetapi dalam jawaban ini, disebutkan bahwa ActiveXObject dapat digunakan untuk mendeteksi versi IE. Meskipun dapat diperdebatkan bahwa Edge seharusnya disebut sebagai versi IE atau tidak (Microsoft tentu tidak ingin menyebutnya sebagai salah satu), tetapi bagi banyak pengembang, IE telah menjadi sinonim untuk semua browser Microsoft default.
Neo
45

Gunakan MSInputMethodContextsebagai bagian dari pemeriksaan deteksi fitur. Sebagai contoh:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

Referensi

Paul Sweatte
sumber
2
Menurut saya ini lebih kuat. Tentu saja apa pun berdasarkan agen pengguna sangat tidak berguna.
David G
1
Itu berfungsi, bukan ActiveXObject. Terima kasih banyak
Tarık Özgün Güner
1
@tdakhla Diperbarui untuk menyaring IE Edge.
Paul Sweatte
Penting untuk dicatat salah satu dari jawaban ini yang mungkin tampak tidak berfungsi adalah untuk memeriksa pengaturan Emulasi, saya akan menandai jawaban ini sebagai salah, tetapi kemudian saya memeriksa emulasi dan melihat bahwa beberapa pengaturan kompatibilitas intranet mengesampingkan mode tampilan , setelah itu dikeluarkan dari persamaan solusi ini bekerja dengan baik untuk saya.
Shaun
1
Hanya dikonfirmasi #falsedi non-IE, IE8,9,10, Edge 14,15. #truehanya di IE11. Tidak menguji dengan mode dokumen aktif. Diuji dengan Browserstack.
danjah
15

Saya sudah membaca jawaban Anda dan membuat campuran. Tampaknya berfungsi dengan Windows XP (IE7 / IE8) dan Windows 7 (IE9 / IE10 / IE11).

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

Tentu saja jika saya mengembalikan 0, berarti tidak ada IE.

Fabio
sumber
12

Dapatkan Versi IE dari Agen-Pengguna

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

Cara kerjanya: String agen pengguna untuk semua versi IE mencakup bagian " versi ruang MSIE " atau "Trident other-text rv space-or-colon versi ". Mengetahui hal ini, kami mengambil nomor versi dari ekspresi reguler. Sebuah blok digunakan untuk mempersingkat kode, kalau tidak kita akan perlu untuk menguji batas array untuk browser non-IE. String.match()try-catch

Catatan: Agen-pengguna dapat dipalsukan atau dihilangkan, terkadang tanpa disengaja jika pengguna telah mengatur browser mereka ke "mode kompatibilitas". Meskipun ini sepertinya tidak banyak masalah dalam praktiknya.


Dapatkan Versi IE tanpa Agen-Pengguna

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

Cara kerjanya: Setiap versi IE menambahkan dukungan untuk fitur tambahan yang tidak ditemukan di versi sebelumnya. Jadi kami dapat menguji fitur-fitur secara top-down. Sebuah ternary urutan digunakan di sini untuk singkatnya, meskipun if-thendan switchpernyataan akan bekerja sama dengan baik. Variabel iediatur ke integer 5-11, atau 1 untuk yang lebih lama, atau 99 untuk yang lebih baru / non-IE. Anda dapat mengaturnya ke 0 jika Anda hanya ingin menguji IE 1-11 dengan tepat.

Catatan: Deteksi objek dapat rusak jika kode Anda dijalankan pada halaman dengan skrip pihak ketiga yang menambahkan polyfill untuk hal-hal seperti document.addEventListener. Dalam situasi seperti itu, agen-pengguna adalah pilihan terbaik.


Mendeteksi jika Browser Modern

Jika Anda hanya tertarik pada apakah browser mendukung sebagian besar standar HTML 5 dan CSS 3, Anda dapat mengasumsikan bahwa IE 8 dan yang lebih rendah tetap menjadi aplikasi masalah utama. Pengujian untuk window.getComputedStyleakan memberi Anda perpaduan yang cukup baik dari browser modern, juga (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 sangat meningkatkan dukungan standar, tetapi animasi CSS asli membutuhkan IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 
Beejor
sumber
'Dapatkan Versi IE dari Agen-Pengguna' berfungsi dengan baik! hanya untuk memastikan, ini akan menampilkan semua versi termasuk IE11?
omer
1
@omer Ya, karena mencari string "MSIE" atau "Trident"; yang terakhir digunakan oleh IE 11 ke atas. Jadi itu akan bekerja untuk semua versi IE di masa depan sampai MS mengubah nama mesin browsernya. Saya percaya browser Edge baru masih menggunakan Trident.
Beejor
Ini bekerja dengan baik, terima kasih @Beejor! Saya menerapkan pengalihan sederhana ke halaman lain menggunakan jawaban Anda: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV
@BernardV Terlihat bagus! Kiat kilat: jika Anda memiliki akses ke server, mendeteksi agen-pengguna dalam skrip di sana mungkin berfungsi lebih baik, karena pengguna tidak akan melihat adanya pengalihan / flicker, lebih sedikit permintaan HTTP, dll. Tetapi dalam keadaan darurat melakukannya dengan JS juga berfungsi.
Beejor
9

Angular JS melakukan cara ini.

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msie akan menjadi angka positif jika IE dan NaN untuk browser lain seperti chrome, firefox.

kenapa

Pada Internet Explorer 11, string agen-pengguna telah berubah secara signifikan.

lihat ini:

msdn # 1 msdn # 2

Vishal Sharma
sumber
7

solusi:

function GetIEVersion() {
  var sAgent = window.navigator.userAgent;
  var Idx = sAgent.indexOf("MSIE");
  // If IE, return version number.
  if (Idx > 0)
    return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));

  // If IE 11 then look for Updated user agent string.
  else if (!!navigator.userAgent.match(/Trident\/7\./))
    return 11;

  else
    return 0; //It is not IE

}
if ((GetIEVersion() > 0) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		

coperniko
sumber
1
Favorit saya - menyumbang IE6-10 dan IE11. Saya menambahkan cek untuk keunggulan juga
AlbatrossCafe
Ini mendeteksi Firefox sebagaiThis is IE 0
KSPR
3

Saya menggunakan metode yang lebih sederhana:

Objek global navigator memiliki titik sentuh properti, di Internet Exlorer 11 disebut msMaxTouchPoints tho.

Jadi jika Anda mencari:

navigator.msMaxTouchPoints !== void 0 

Anda akan menemukan Internet Explorer 11.

Dvid Silva
sumber
1
Ini juga mengembalikan trun pada IE 10 (Win 7)
Programmer Kimia
2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;
areschen
sumber
Jika Anda menggunakan regex untuk chec, Anda dapat menambahkan tanda i untuk membuatnya tidak sensitif, daripada .toLowerCase (). Juga tidak perlu untuk metode .toString ().
Jake Rowsell
2

Coba ini:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}
Krunal
sumber
Kode salah karena browser Acoo menggunakan "MSIE" dalam agen pengguna. Lihatlah useragentstring.com/pages/Acoo%20Browser
Pengguna
ARGUMEN SALAH. Saya telah menguji di semua browser IE, bahkan perangkat Win8 juga.
Krunal
Anda menguji peramban IE11 tetapi tidak peramban Acoo dan peramban Acoo menggunakan "MSIE" di agen pengguna seperti yang saya katakan, jadi IEold juga mendeteksi peramban Acoo sebagai IEold (Versi lama IE) dan saya yakin peramban Acoo menggunakan " MSIE "di agen pengguna karena saya telah melakukan navigator.userAgent di situs uji javascript dengan browser Acoo (Situs uji: w3schools.com )
Pengguna
Bisakah Anda memberikan solusi yang lebih baik untuk ini?
Krunal
Anda dapat menggunakan !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsetetapi itu tidak selalu berhasil karena browser acoo tidak selalu memiliki "Acoo Browser;" dalam agen pengguna tetapi sebenarnya Anda tidak perlu peduli bahwa browser acoo memiliki "MSIE" di agen pengguna karena browser acoo hampir sama.
Pengguna
1

Ini tampaknya menjadi metode yang lebih baik. "indexOf" mengembalikan -1 jika tidak ada yang cocok. Itu tidak menimpa kelas yang ada pada tubuh, hanya menambahkannya.

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}
joe
sumber
0

Deteksi sebagian besar browser dengan ini:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945

earlonrails
sumber
0

Saya menggunakan onscrollacara di elemen dengan scrollbar. Ketika dipicu di IE, saya menambahkan validasi berikut:

onscroll="if (document.activeElement==this) ignoreHideOptions()"
Martin
sumber
0

Hanya untuk Browser IE:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

gunakan waspada (yaitu);

Pengujian:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

Perbarui 01 Jun 2017

Sekarang kita bisa menggunakan sesuatu yang lebih mudah dan sederhana:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;
James Peter
sumber
Di mana saya dapat menemukan objek global standar baru yang ditambahkan ke versi Edge yang baru? Saya menyimpulkan Math.acosh adalah salah satunya.
j4v1
1
@ j4v1 Math.acosh Hanya Didukung di Microsoft Edge (Browser tepi). Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Metode ini berhenti bekerja untuk saya. Di masa lalu itu benar mendeteksi IE11 tetapi sekarang saya memiliki Internet Explorer versi 11.1198.14393.0 (Pembaruan versi 11.0.42 (KB4018271)) berjalan pada Windows 10 Enterprise (versi 1607, OS Build 14393.1198) Matematika tampaknya mendukung metode acosh.
Thijs
@ Thijs Di Windows 10 Education dengan IE11 v 11.1198.14393.0 Saya diuji dengan sukses. Anda harus mencoba fungsi matematika lain sesuai dengan ES6.
James Peter
@ JamesPeter Saya sudah mendarat setelah memeriksa document.documentMode. Ini tampaknya menjadi properti yang lebih andal untuk memeriksa IE11 atau Edge. documentMode ada di IE11 tetapi tidak ada lagi di Edge.
Thijs
0

Sejujurnya saya akan mengatakan menggunakan perpustakaan yang melakukan apa yang Anda butuhkan (seperti platform.js misalnya). Pada titik tertentu hal akan berubah dan perpustakaan akan dilengkapi untuk perubahan itu dan penguraian manual menggunakan ekspresi reguler akan gagal.

Terima kasih Tuhan, IE hilang ...

Matthias Hryniszak
sumber