IE11을 감지하는 방법?


212

IE를 감지하려면이 코드를 사용하십시오.

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

그러나 IE11은 "Internet Explorer를 사용하지 않습니다"를 반환합니다. 어떻게 감지합니까?



1
사용자 에이전트를 기반으로하는 모든 결함이 있습니다. 스푸핑하기가 너무 쉽습니다. 이제 이것이 문제가되지 않을 수도 있지만 브라우저 감지 스크립트는 가장 무도회를 감지 할 가능성이 높습니다. 조건부 주석 조합을 사용하여 document.documentMode를 강제로 변환 한 다음 아래의 Paul Sweatte에 따라 window.MSInputMethodContext를 봅니다. 내 코드를 게시했지만 죽은 말이 막혔습니다.
David G

3
IE11은 Gecko Os와 같은 사용자 에이전트 : Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv : 11.0) : 6.1-win7, 6.3-win81
razor

1
내 답변을 여기에서보십시오 stackoverflow.com/questions/21825157/…
Royi Namir

1
내가 찾은 최고의 솔루션은 다음과 같습니다. stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&!
window.ActiveXObject

답변:


221

이 변경 목록에MSIE 따르면 IE11은 더 이상로보고하지 않습니다 . 오 탐지를 피하기위한 것입니다.

IE 를 정말로 알고 싶다면 할 수있는 일은 (테스트되지 않은)과 같은 반환 된 Trident/경우 사용자 에이전트에서 문자열 을 감지하는 것입니다.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 (afaik)은 여전히 ​​미리보기 상태이며 사용자 에이전트는 릴리스 전에 변경 될 수 있습니다.


81
it's intentional to avoid mis-detection-슬프게도, 이제 IE11이 릴리스되었으므로 IE11 에서만 깨진 코드가 있지만 IE의 올바른 탐지는 작동했을 것입니다.
Izkata

68
버전이 덜 중요하다면 내가 부울에이 솔루션을 변환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))); }
rg89

6
@lzkata- html5 사양에 따라 IE는 실제로 표준을 따릅니다 . 그렇습니다. 의도적이지만 새로운 표준에
따릅니다 (

11
"그들이 한 이유는 의도적이었습니다. 그들은 이와 같은 브라우저 감지 스크립트를 중단하고 싶었습니다." 에서 stackoverflow.com/a/18872067/1066234 ... 사실이 있어야한다 : '그들은 웹 사이트는 다음과 같이 휴식 억을 만들고 싶었다.'
Kai Noack

15
이것은 나를 위해 작동합니다 : var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); source
Kai Noack

86

!(window.ActiveXObject) && "ActiveXObject" in windowIE11을 명시 적으로 감지하는 데 사용 합니다.

IE (pre-Edge, "Trident") 버전을 감지하려면 "ActiveXObject" in window대신 사용하십시오.


2
이 Microsoft 문서에서는이 솔루션이 더 이상 작동하지 않을 수 있음을 제안합니다. msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan

5
실제로이 기사에서는 내 방법이 작동하는 이유를 설명합니다. window.ActiveXObject기사에 설명 된대로 액세스를 시도하면 undefinedIE11에서 (Microsoft 이외의 브라우저에서도) in리턴 true됩니다 . javascript 연산자를 사용한 테스트 는 모든 Microsoft 브라우저에서 리턴 하므로 두 경우 모두 IE11에서 엄격하게 적용됩니다. Microsoft가 in운영자 의 동작을 변경하면 이 방법이 중단됩니다.
mcw

5
창의 "ActiveXObject"는 Edge에서 False를 반환합니다.
Neo

8
@neo 가장자리가 IE없는, 영업 이익의 질문이었다 IE11 감지하는 방법
mastazi

1
@mastazi yea 그러나이 답변에서는 ActiveXObject를 사용하여 모든 IE 버전을 감지 할 수 있다고 언급합니다. Edge를 IE의 버전이라고 부르거나 말아야 할 것은 논쟁의 여지가 있지만 (Microsoft는 분명히 그것을 부르기를 원하지 않습니다), 많은 개발자들에게 IE는 기본 Microsoft 브라우저의 동의어가되었습니다.
Neo

45

MSInputMethodContext기능 감지 점검의 일부로 사용 하십시오. 예를 들면 다음과 같습니다.

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

참고 문헌


2
이것은 더 강력 해 보입니다. 확실히 사용자 에이전트를 기반으로하는 것은 쓸모가 없습니다.
David G

1
ActiveXObject 대신 작동했습니다. 감사합니다
Tarık Özgün Güner

1
@tdakhla IE Edge를 필터링하도록 업데이트되었습니다.
Paul Sweatte

작동하지 않는 것처럼 보일 수있는 이러한 답변 중 하나를 에뮬레이션하는 것이 에뮬레이션 설정을 확인하는 것입니다.이 답변을 잘못된 것으로 표시하려고했지만 에뮬레이션을 확인하고 일부 인트라넷 호환성 설정이 디스플레이 모드를 재정의하는 것을 보았습니다. , 일단 그것이 방정식에서 제거되면이 솔루션은 저에게 잘 작동했습니다.
Shaun

1
#false비 IE, IE8,9,10, Edge 14,15에서 방금 확인 되었습니다. #trueIE11에서만. 문서 모드가 활성화 된 상태에서 테스트하지 않았습니다. Browserstack으로 테스트했습니다.
danjah

15

나는 당신의 답변을 읽고 혼합했습니다. Windows XP (IE7 / IE8) 및 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;         
}

물론 0을 반환하면 IE가 없음을 의미합니다.


12

User-Agent에서 IE 버전 가져 오기

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

작동 방식 : 모든 IE 버전 의 사용자 에이전트 문자열 에는 "MSIE 공간 버전 "또는 "Trident other-text rv space-or-colon version "부분이 포함되어 있습니다. 이를 알면 String.match()정규 표현식 에서 버전 번호를 가져옵니다 . try-catch블록은 그렇지 않으면 우리는 비 IE 브라우저의 배열 범위를 테스트해야하는 것, 코드를 단축하는 데 사용됩니다.

참고 : 사용자 에이전트가 브라우저를 "호환 모드"로 설정 한 경우 사용자 에이전트가 스푸핑되거나 생략 될 수 있습니다. 실제로 이것은 큰 문제가되지는 않지만.


User-Agent없이 IE 버전 받기

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

작동 방식 : 각 버전의 IE는 이전 버전 에는 없었던 추가 기능에 대한 지원을 추가합니다 . 따라서 하향식으로 기능을 테스트 할 수 있습니다. 하지만 시퀀스는 간결 여기를 사용 if-then하고 switch문 마찬가지로 잘 작동합니다. 변수 ie는 정수 5-11, 이전의 경우 1, 최신 / 비 IE의 경우 99로 설정됩니다. IE 1-11을 정확하게 테스트하려면 0으로 설정할 수 있습니다.

참고 : 와 같은 것에 폴리 필을 추가하는 타사 스크립트가있는 페이지에서 코드를 실행하면 객체 감지가 중단 될 수 있습니다 document.addEventListener. 그러한 상황에서 user-agent가 최선의 선택입니다.


브라우저가 최신인지 감지

브라우저가 대부분의 HTML 5 및 CSS 3 표준을 지원하는지 여부에 관심이 있다면 IE 8 이하가 주요 문제 앱으로 남아 있다고 합리적으로 생각할 수 있습니다 . 테스트 window.getComputedStyle하면 최신 브라우저가 상당히 잘 혼합됩니다 (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9는 표준 지원을 크게 향상 시키지만 네이티브 CSS 애니메이션에는 IE 10이 필요합니다.

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

'User-Agent에서 IE 버전 가져 오기'가 잘 작동합니다! IE11을 포함한 모든 버전이 표시됩니까?
omer

1
@omer 예, "MSIE"또는 "Trident"문자열을 찾기 때문에; 후자는 IE 11 이상에서 사용됩니다. 따라서 MS가 브라우저 엔진의 이름을 변경할 때까지 모든 향후 IE 버전에서 작동합니다. 새로운 Edge 브라우저는 여전히 Trident를 사용한다고 생각합니다.
Beejor

@Beejor 감사합니다! 귀하의 답변을 사용하여 다른 페이지로 간단한 리디렉션을 구현했습니다. 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 좋아 보인다! 빠른 팁 : 서버에 액세스 할 수 있고 스크립트에서 사용자 에이전트를 감지하면 사용자가 리디렉션 / 깜박임, 적은 HTTP 요청 등을 알지 못하기 때문에 더 잘 작동 할 수 있습니다. JS도 작동합니다.
Beejor

9

각도 JS는 이런 식으로합니다.

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

크롬, 파이어 폭스와 같은 다른 브라우저의 IE 및 NaN 인 경우 msie는 양수입니다.

왜 ?

Internet Explorer 11부터 사용자 에이전트 문자열이 크게 변경되었습니다.

이것을 참조하십시오 :

msdn # 1 msdn # 2


7

해결책 :

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
내가 가장 좋아하는 것은 IE6-10과 IE11을 설명합니다. 가장자리도 확인했습니다
AlbatrossCafe

이것은 Firefox를 다음과 같이 감지합니다This is IE 0
KSPR

3

더 간단한 방법을 사용하고 있습니다.

네비게이터 전역 객체에는 속성 터치 포인트가 있으며 Internet Exlorer 11에서는 msMaxTouchPoints라고합니다.

따라서 다음을 찾으면

navigator.msMaxTouchPoints !== void 0 

Internet Explorer 11이 있습니다.


1
또한 IE 10 (Win 7)에서 trun을 반환합니다.
화학 프로그래머

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;

정규식을 사용하여 chec을 사용하는 경우 i 플래그를 추가하여 .toLowerCase () 대신 대소 문자를 구분하지 않도록 할 수 있습니다. .toString () 메소드도 필요하지 않습니다.
Jake Rowsell

2

이 시도:

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

Acoo 브라우저가 useragent에서 "MSIE"를 사용하기 때문에 잘못된 코드입니다. useragentstring.com/pages/Acoo%20Browser를
사용자

잘못된 주장. 모든 IE 브라우저, 심지어 Win8 장치에서도 테스트했습니다.
Krunal

IE11 브라우저를 테스트했지만 Acoo 브라우저는 테스트하지 않았으며 Acoo 브라우저는 내가 말한 것처럼 useragent에서 "MSIE"를 사용하므로 IEold도 Acoo 브라우저를 IEold (이전 버전의 IE)로 감지하고 Acoo 브라우저는 " Acoo 브라우저가있는 자바 스크립트 테스트 사이트에서 navigator.userAgent를 수행했기 때문에 useragent의 MSIE "(테스트 사이트 : w3schools.com )
사용자

더 나은 솔루션을 제공해 주시겠습니까?
Krunal

U는 사용할 수 !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : false있지만 acoo 브라우저에는 항상 "Acoo Browser"가 없기 때문에 항상 작동하지는 않습니다. acoo 브라우저는 거의 동일하기 때문에 실제로는 사용자 에이전트에서 acoo 브라우저가 useragent에 "MSIE"를 가지고 있다는 것을 신경 쓸 필요가 없습니다.
사용자

1

이것은 더 나은 방법으로 보입니다. 일치하는 것이 없으면 "indexOf"는 -1을 반환합니다. 본문의 기존 클래스를 덮어 쓰지 않고 추가합니다.

// 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

이것으로 대부분의 브라우저를 감지하십시오.

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

onscroll스크롤 막대가있는 요소 의 이벤트를 사용했습니다 . IE에서 트리거되면 다음 유효성 검사를 추가했습니다.

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

0

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

경고 사용 (ie);

테스트 :

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

2017 년 6 월 1 일 업데이트

이제 더 쉽고 간단한 것을 사용할 수 있습니다.

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에 추가 된 새 표준 전역 개체를 어디에서 찾을 수 있습니까? 나는 Math.acosh가 그중 하나라고 추론합니다.
j4v1

1
@ j4v1 Math.acosh 만 Microsoft Edge (Edge 브라우저)에서 지원됩니다. 참조 : msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter

이 방법은 나를 위해 작동을 멈췄습니다. 과거에는 IE11을 올바르게 감지했지만 Windows 10 Enterprise (버전 1607, OS 빌드 14393.1198)에서 실행되는 Internet Explorer 버전 11.1198.14393.0 (업데이트 버전 11.0.42 (KB4018271))이 있으므로 수학은 acosh 방법을 지원하는 것으로 보입니다.
Thijs

@Thijs IE11 v 11.1198.14393.0이 설치된 Windows 10 Education에서 성공적으로 테스트했습니다. ES6에 따라 다른 수학 함수를 시도해야합니다.
James Peter

@JamesPeter 나는 document.documentMode를 확인했을 때 착륙했습니다. 이것은 IE11 또는 Edge를 확인하는보다 안정적인 속성 인 것 같습니다. documentMode는 IE11에는 있지만 더 이상 Edge에는 없습니다.
Thijs

0

솔직히 필자는 필요한 것을 수행하는 라이브러리 (예 : platform.js)를 사용한다고 말합니다. 어떤 시점에서 상황이 변경되고 라이브러리에 이러한 변경 사항이 적용되고 정규식을 사용한 수동 구문 분석이 실패합니다.

고마워 IE가 사라지다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.