IE11 nasıl tespit edilir?


212

IE tespit etmek istediğimde bu kodu kullanıyorum:

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 );
}

Ancak IE11 "Internet Explorer kullanmıyorsunuz" döndürüyor. Nasıl tespit edebilirim?



1
Kullanıcı aracısına dayalı her şey kusurludur. Taklit etmek çok kolay, Şimdi, bu bir sorun değil, ama bana öyle geliyor ki, bir tarayıcı algılama komut dosyasının maskeleme tespiti için adil bir şansı olmalı. Koşullu yorumların bir kombinasyonunu kullanarak, document.documentMode'u zorlamak ve sonra aşağıdaki Paul Sweatte'e göre window.MSInputMethodContext'e bakmaya çalışmak için kullanıyorum. Kodumu gönderirdim ama ölü bir atı kırbaçlıyor.
David G

3
IE11'in kullanıcı aracısı vardır: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) Gecko Os türleri gibi: 6.1 - win7, 6.3 - win81
ustura

1
cevabımı buradan görebilirsiniz stackoverflow.com/questions/21825157/…
Royi Namir

1
İşte bulduğum en iyi çözüm: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// IE11}
xorcus

Yanıtlar:


221

IE11 artık rapor etmiyor MSIE, bu değişiklik listesine göre yanlış tespitin önlenmesi kasıtlı.

Eğer gerçekten IE olduğunu bilmek istiyorsanız ne yapabilir, eğer (denenmemiş) gibi bir şey döndürürse , Trident/kullanıcı aracısı dize tespit etmektir ;navigator.appNameNetscape

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());

IE11'in (afaik) hala önizlemede olduğunu ve kullanıcı aracısının yayınlanmadan önce değişebileceğini unutmayın.


81
it's intentional to avoid mis-detection- Ne yazık ki, şimdi IE11 serbest bırakıldı, biz sadece IE11 kırık kodu var , oysa IE doğru bir algılama işe
yarayacaktır

68
Sürüm daha az önemliyse bu çözümü function isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
Boole'ye

6
@lzkata - Buradaki html5 spesifikasyonuna göre IE aslında standardı takip ediyor. Yani evet, kasıtlı, ama yeni standartlara göre (eski html
api'yi onaylamıyor

11
"bunu yapmalarının nedeni kasıtlıydı. Bunun gibi tarayıcı algılama komut dosyalarını kırmak istediler." dan stackoverflow.com/a/18872067/1066234 ... Aslında bu olmalıdır: 'Onlar web siteleri böyle kırmak milyar yapmak istedim.'
Kai Noack

15
Bu benim için çalışıyor: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); kaynak
Kai Noack

86

!(window.ActiveXObject) && "ActiveXObject" in windowIE11'i açıkça algılamak için kullanın .

Herhangi bir IE (Edge öncesi, "Trident") sürümünü algılamak için "ActiveXObject" in windowbunun yerine kullanın.


2
Bu Microsoft makalesi, bu çözümün artık çalışmayabileceğini önermektedir msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan

5
Aslında, bu makalede yöntemimin çalışmasının nedenini açıklar. window.ActiveXObjectMakalede açıklandığı gibi erişmeye çalışmak undefinedşimdi IE11'de (Microsoft'a ait olmayan tarayıcıların yanı sıra) indöner true. Javascript operatörünü kullanan test tüm Microsoft tarayıcılarında geri döner , bu nedenle her ikisi de kesinlikle IE11'de geçerlidir. Microsoft inoperatörün davranışında bir değişiklik yaparsa , evet, bu yöntem bozulur.
mcw

5
Penceredeki "ActiveXObject" Edge'de False değerini döndürür.
Neo

8
@Neo Edge IE değil, OP'nin sorusu IE11'in nasıl tespit edileceğiydi
mastazi

1
@mastazi yea ancak bu cevapta ActiveXObject'in herhangi bir IE sürümünü tespit etmek için kullanılabileceği belirtiliyor. Edge'in IE sürümü olarak adlandırılıp çağrılmaması gerektiği tartışmalı olsa da (Microsoft kesinlikle bir tane çağırmak istemez), ancak geliştiricilerin çoğu için IE herhangi bir varsayılan Microsoft tarayıcısının eş anlamlısı haline gelmiştir.
Neo

45

MSInputMethodContextÖzellik algılama kontrolünün bir parçası olarak kullanın . Örneğin:

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

Referanslar


2
Bana göre bu daha sağlam. Kesinlikle kullanıcı aracısına dayalı herhangi bir şey oldukça işe yaramaz.
David G

1
ActiveXObject yerine işe yaradı. Çok teşekkürler
Tarık Özgün Güner

1
@tdakhla IE Edge'i filtrelemek için güncellendi.
Paul Sweatte

Çalışmıyor gibi görünen bu cevaplardan herhangi birinin not edilmesi önemli, Emülasyon ayarlarını kontrol etmek, bu cevabı yanlış olarak işaretleyecektim ama sonra emülasyonu kontrol ettim ve bazı intranet uyumluluk ayarlarının ekran modunu geçersiz kıldığını gördüm , bu denklemden çıkarıldıktan sonra bu çözüm benim için iyi çalıştı.
Shaun

1
Sadece #falseIE olmayan, IE8,9,10, Edge 14,15'te onaylandı. #truesadece IE11'de. Belge modu etkinken test yapmadı. Browserstack ile test edildi.
danjah

15

Cevaplarını okudum ve bir karışım yaptım. Windows XP (IE7 / IE8) ve Windows 7 (IE9 / IE10 / IE11) ile çalışıyor gibi görünüyor.

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;         
}

Tabii 0 döndürürsem, IE yok demektir.


12

IE Sürümünü User-Agent'tan Alın

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

Nasıl çalışır: Tüm IE sürümleri için kullanıcı aracısı dizesi "MSIE alanı sürümü " veya "Trident diğer metin rv alanı veya iki nokta sürümü " bölümünü içerir . Bunu bilerek, String.match()normal bir ifadeden sürüm numarasını alırız . try-catchKodu kısaltmak için bir blok kullanılır, aksi takdirde IE olmayan tarayıcılar için dizi sınırlarını test etmemiz gerekir.

Not: Kullanıcı aracısı, bazen tarayıcılarını bir "uyumluluk moduna" ayarladıysa, kasıtlı olarak taklit edilebilir veya atlanabilir. Bu pratikte bir sorun gibi görünmese de.


User-Agent olmadan IE Sürümü edinin

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 );

Nasıl çalışır: IE'nin her sürümü, önceki sürümlerde bulunmayan ek özellikler için destek ekler . Böylece özellikleri yukarıdan aşağıya test edebiliriz. Bir üçlü olsa dizisi, kısalık için burada kullanılan if-thenve switchifadeleri gibi iyi çalışır. Değişken ie, eski için 5-11 veya 1 veya yeni / IE olmayanlar için 99 tamsayısına ayarlanır. IE 1-11'i tam olarak test etmek istiyorsanız 0 olarak ayarlayabilirsiniz.

Not: Kodunuz, benzer şeyler için çoklu dolgular ekleyen üçüncü taraf komut dosyalarına sahip bir sayfada çalıştırılırsa nesne algılama bozulabilir document.addEventListener. Bu gibi durumlarda kullanıcı-aracı en iyi seçenektir.


Tarayıcının Modern olup olmadığını algılama

Yalnızca bir tarayıcının çoğu HTML 5 ve CSS 3 standardını destekleyip desteklemediğiyle ilgileniyorsanız , IE 8 ve daha düşük sürümlerin birincil sorunlu uygulamalar olarak kaldığını makul bir şekilde kabul edebilirsiniz . Test yapmak window.getComputedStyle, size modern tarayıcıların oldukça iyi bir karışımını verecektir (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9, standart desteği büyük ölçüde geliştirir, ancak yerel CSS animasyonu IE 10 gerektirir.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

'User-Agent IE sürümünü alın' güzel çalışır! sadece emin olmak için, bu IE11 dahil tüm sürümü gösterecektir?
omer

1
@omer Evet, çünkü "MSIE" veya "Trident" dizesini arar; ikincisi IE 11 ve üstü tarafından kullanılır. Bu yüzden, MS tarayıcı motorunun adını değiştirene kadar gelecekteki tüm IE sürümleri için çalışacaktır. Yeni Edge tarayıcısının hala Trident kullandığını düşünüyorum.
Beejor

Bu harika çalışıyor, teşekkürler @Beejor! Cevabınızı kullanarak başka bir sayfaya basit bir yönlendirme uyguladım: 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 İyi görünüyor! Hızlı bir ipucu: sunucuya erişiminiz varsa, bir komut dosyasındaki kullanıcı aracısını algılamak daha iyi sonuç verebilir, çünkü kullanıcı herhangi bir yönlendirme / titreşim, daha az HTTP isteği, vb. Fark etmeyecektir. JS de çalışıyor.
Beejor

9

Açısal JS bu şekilde yapar.

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

msie, krom ve firefox gibi diğer tarayıcılar için IE ve NaN ise pozitif sayı olacaktır.

neden ?

Internet Explorer 11'den itibaren, kullanıcı aracısı dizesi önemli ölçüde değişti.

buna bakın:

msdn # 1 msdn # 2


7

çözüm :

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 ");
}		


1
Benim favorim - IE6-10 ve IE11 hesapları. Kenar kontrolünü de ekledim
AlbatrossCafe

Bu Firefox'u tespit ediyorThis is IE 0
KSPR

3

Daha basit bir yöntem kullanıyorum:

Gezgin global nesnesinin bir özellik temas noktaları vardır, Internet Explorer 11'de msMaxTouchPoints tho olarak adlandırılır.

Eğer bakarsanız:

navigator.msMaxTouchPoints !== void 0 

Internet Explorer 11'i bulacaksınız.


1
Ayrıca IE 10 (Win 7) üzerinde trun döndürür
Kimyasal Programcı

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;

Çekine regex kullanıyorsanız .toLowerCase () yerine büyük / küçük harfe duyarsız hale getirmek için i bayrağını ekleyebilirsiniz. .ToString () yöntemine de gerek yoktur.
Jake Rowsell

2

Bunu dene:

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")
}

Yanlış kod çünkü Acoo tarayıcısı useragent'da "MSIE" kullanıyor. Useragentstring.com/pages/Acoo%20Browser
Kullanıcı

YANLIŞ ARGÜMAN. Tüm IE tarayıcılarında, hatta Win8 cihazlarında bile test yaptım.
Krunal

IE11 tarayıcısını test ettiniz, ancak Acoo tarayıcısı ve Acoo tarayıcısı, IEold'un Aoldo IE'yi (IE'nin eski sürümü) olarak algıladığını ve bu nedenle Acoo tarayıcısının kullandığından emin olduğumu söylediğim gibi kullanıcı arayüzünde "MSIE" kullanıyor. MSIE "kullanıyorum çünkü Acoo tarayıcısı ile bir javascript test sitesinde navigator.userAgent yaptım (Test sitesi: w3schools.com )
Kullanıcı

Bunun için lütfen daha iyi bir çözüm verebilir misiniz?
Krunal

U kullanabilirsiniz !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falseama bu her zaman işe yaramaz çünkü acoo tarayıcı her zaman "Acoo Tarayıcı;" ama uco acoo tarayıcı neredeyse aynı olduğundan çünkü acoo tarayıcı kendi useragent "MSIE" umurumda gerekmez.
Kullanıcı

1

Bu daha iyi bir yöntem gibi görünüyor. "indexOf", eşleşen bir şey yoksa -1 değerini döndürür. Vücuttaki mevcut sınıfların üzerine yazmaz, sadece ekler.

// 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';
}

0

Çoğu tarayıcıyı şu şekilde tespit edin:

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


0

onscrollOlayı kaydırma çubuğundaki öğede kullandım . IE'de tetiklendiğinde, aşağıdaki doğrulamayı ekledim:

onscroll="if (document.activeElement==this) ignoreHideOptions()"

0

Sadece IE Tarayıcı için:

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;
                }
        }
    }

uyarı kullan (yani);

Test yapmak:

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);

Güncelleme 01 Haz 2017

Artık daha kolay ve basit bir şey kullanabiliriz:

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;

Edge'in yeni sürümlerine eklenen yeni standart global nesneleri nerede bulabilirim? Math'ı çıkarıyorum. Acosh bunlardan biri.
j4v1

1
@ j4v1 Math.acosh Yalnızca Microsoft Edge'de (Edge tarayıcı) desteklenir. Ref: msdn.microsoft.com/tr-tr/tr-tr/library/dn858239(v=vs.94).aspx
James Peter

Bu yöntem benim için çalışmayı durdurdu. Geçmişte doğru IE11 tespit etti, ancak şimdi Windows 10 Enterprise (sürüm 1607, OS Build 14393.1198) üzerinde çalışan Internet Explorer sürüm 11.1198.14393.0 (Güncelleme sürüm 11.0.42 (KB4018271)) var acosh yöntemini destekliyor gibi görünüyor.
Thijs

@Thijs Windows 10'da IE11 v 11.1198.14393.0 ile Eğitim Başarıyla test ettim. ES6'ya göre başka bir matematik işlevi denemelisiniz.
James Peter

@JamesPeter document.documentMode'u kontrol ettikten sonra indim. Bu IE11 veya Edge kontrol etmek için daha güvenilir bir özellik gibi görünüyor. documentMode IE11'de var, ancak Edge'de artık mevcut değil.
Thijs

0

Açıkçası ben ihtiyacınız olan bir kütüphane kullanın söyleyebilirim (örneğin platform.js gibi). Bir noktada işler değişecek ve kütüphane bu değişiklikler için donatılacak ve düzenli ifadeler kullanılarak manuel ayrıştırma başarısız olacaktır.

Tanrıya şükür IE gidiyor ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.