JavaScript : IE7 또는 IE8 호환 모드 인 경우 IE9를 감지 할 수 있습니까?


87

사용자 에이전트 문자열을 통해 IE7 또는 IE8로 식별되는 브라우저가 실제로 해당 브라우저인지 아니면 7 또는 8 호환성 모드의 IE9인지 알아야합니다.

사용자 에이전트 문자열에서 볼 수 있듯이 IE7 호환 모드의 IE9는 실제 IE7과 동일한 문자열을 제공합니다. 위장 된 "정말"IE9인지 테스트 할 수있는 추가 속성 / 요소 / 객체가 있습니까?

내 스크립트가로드 된 페이지가 특수한 설정을 강요하거나 특정 설정을 강요 할 수 있으므로 문서 모드가 도움이되지 않는다고 가정합니다.

IE9가 7, 8 또는 9 모드에 관계없이 존재하고 테스트 할 수있는 속성을 갖기를 바랍니다.


추가하기 위해 수정…

좋아, 이제 내가 어디로 잘못 가고 있는지 알 수 있습니다. "브라우저 모드"드롭 다운을 사용하여 IE8과 IE7로 전환하고 이것이 각각 "IE8 호환 모드"와 "IE7 호환 모드"라고 생각했습니다. 물론 이것은 사실이 아닙니다. 개발자 도구의 브라우저 모드는 실제로 이전 브라우저와 "같이되도록"전환하므로 원래 사용자 에이전트 문자열이보고되는 것이 옳습니다.

브라우저 모드를 IE9 또는 IE9 호환성 상태로두고 대신 문서 모드 드롭 다운 변형을 시도하면 실제로 "Trident / 5.0"이 8 가지 조합 (2 개의 브라우저 모드 및 4 개의 문서 모드)에 표시됩니다. IE7과 IE8은 실제로 (시뮬레이션 된) IE7과 IE8이기 때문에 브라우저 모드 IE7과 IE8을 선택하지 않아도됩니다.

따라서 페이지, 개발자가 아닌 사용자, 메타 태그 또는 Microsoft의 호환성 목록이 IE9를 식별 ​​할 수없는 상태로 만들 수있는 방법은 없습니다.

사용 if(navigator.userAgent.indexOf("Trident/5")>-1)만으로 충분합니다.

걱정하지 마세요. 스타일, 서식, 논리 또는 페이지 콘텐츠가 아닙니다. 나는 이러한 것들을 위해 기능 감지를 사용합니다. IE9를 감지하고 (어떤 모드에 있든 관계없이) 페이지가 아닌 콘텐츠 결정을 내리면됩니다.

귀하의 제안과 링크를 통해 답변을 이끌어 주셔서 감사합니다.


1
절대로 사용자 에이전트를 신뢰하지 마십시오. 그것은 완벽하게 거짓말을 할 수 있고 그것이 진실을 말하고 있는지 확신 할 수있는 방법이 없습니다 ... 대신 특정 기능이나 기능을 테스트해야합니다
JCOC611 2011-04-28

2
@ JCOC611 예, 아니오. 이것은 호환성보기에서 IE9인지 확인하는 방법에 대한 구체적인 질문이며 합리적인 질문입니다. 일반적으로 사이트 기능을 위해 사용자 에이전트 문자열에 의존해서는 안됩니다. 사실은 쉽게 속일 수 있기 때문입니다.
Dennis G

1
사용자 에이전트가 정확하더라도 가능하면 기능 감지를 사용하는 것이 훨씬 바람직합니다. 그러면 처음부터 IE가 호환 모드인지 여부를 알 필요가 없습니다.
Dave Ward

1
잘못된 브라우저 모드를 사용하는 사용자에게 빠른 자습서를 제공하려는 경우 매우 유용하다는 점을 덧붙이고 싶습니다.
주스트

1
사용자 에이전트를 스푸핑하고 올바르게 작동하기를 기대하는 @ JCOC611-우리가 그 케이스에 대해 정말로 신경을 써야할까요?
JohnnyFaldo 2014

답변:


67

실제로 IE7 호환 모드에서 실행될 때 IE9의 사용자 에이전트 문자열은 다르기 때문에 다른 IE 버전을 구별하는 가장 좋은 방법 중 하나입니다.

IE9의 사용자 에이전트 문자열 소개 :

IE8과 유사하게 IE9의 호환성보기는 IE7 표준 모드에 매핑되며 호환성보기에서 IE9의 UA 문자열은 다음과 같습니다.

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

호환성보기에서 IE9는 애플리케이션 버전 번호 (Mozilla / 4.0) 및 버전 토큰 (MSIE 7.0)을 통해 자신을 IE7로보고합니다. 이것은 호환성을 위해 수행됩니다. 'Trident / 4.0'에서 'Trident / 5.0'까지 증분 된 Trident 토큰을 사용하면 웹 사이트에서 Compat View에서 실행되는 IE9와 Compat View에서 실행되는 IE8을 구분할 수 있습니다 .

(내가 강조 추가). 따라서 사용자 에이전트 문자열은 자체적으로 "Mozilla / 4.0"및 MSIE 7.0이라고보고하는 것과 동일하지만 IE9는 MSIE 7.0, MSIE 8.0 또는 MSIE 9.0인지에 관계없이 항상 Trident / 5.0입니다.

실제로이 훌륭한 컴파일을 확인해야합니다 : 브라우저 ID (사용자 에이전트) 문자열 또는 더 나은 useragentstrings.com


1
안녕 문 티아. 또한 IE9가 IE7 모드 일 때 "Trident / 5.0"이 있어야한다는 것을 알았습니다. 그러나 Win7 Pro x64의 (최종) IE9에서 볼 수있는 것은 아닙니다. IE7 모드 (실제 IE7의 모습)에서는 트라이던트가 전혀 표시되지 않고 IE8 모드에서는 트라이던트 4가 표시됩니다 (다시, 실제 IE8의 모습). IE9 개발자 도구를 먼저 사용하여 브라우저 모드를 선택한 다음 주소 표시 줄에서 javascript : alert (navigator.userAgent)
Dee2000 2011

1
"Trident / 5.0"은 모든 모드에서 IE9의 사용자 에이전트 문자열에 있습니다.
EricLaw 2011

EricLaw가 말했듯이, Dee. 호환 모드를 사용하는 경우 Trident / 5.0이 있어야합니다 (브라우저 모드에 따라 다를 수 있습니까?). 사용자 에이전트 문자열을 어떻게 확인합니까? whatsmyuseragent.com을 통해 확인 하고 다시보고하십시오.
Dennis G

아래 내 응답을 참조하십시오 (자신의 메시지에 응답을 추가하는 것에 대한 스택 오버플로 8 시간 규칙 때문에 다른 ID Dee2001을 사용해야했습니다). 예 Eric과 Moontear는 모두 정확합니다. Trident / 5.0 모든 IE9 모드에 있습니다. 내 큰 실수는 개발자 도구에서 "브라우저 모드"를 IE7 또는 IE8로 변경하는 것이었지만 이는 페이지 / 메타 태그 / 호환성 목록이 적용 할 수있는 "모드"가 아닙니다. 대신 브라우저 자체를 실제로 시뮬레이션하므로 자연스럽게 useragent 문자열은 IE7 / 8과 같습니다.
Dee2000

1
이것은 완벽 해요! 정말 고마워. 보고 된 브라우저를 기반으로 스타일을 지정하지는 않지만 작업중인 사이트 상단에 사용자가 업그레이드해야한다는 경고 표시 줄을 설정하고 있습니다 (예 : 조건부 태그가 ie7보다 작거나 같다고 표시되는 경우). -이 경우 업그레이드라는 메시지를 표시하지 않고 호환성 모드를 비활성화합니다
Chelsea Urquhart 2013 년

47

document.documentMode 문서 모드에 가장 적합한 방법입니다.


17
대답을 조금 확장하십시오. 더 많은 맥락.
random_user_name 2011

3
왜 사람들은 정확히 필요한 뭐죠,이 plusing되지 않습니다
제이미 Hutber

5
이것이 가장 좋은 방법입니다. 다음과 같이 사용할 수 있습니다 <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>.. real (!) IE7 및 모든 비 IE는 Comp에서 IE8 / 9 만 '정의되지 않음'을 반환합니다. 모드 반환 7. IE10을 테스트 할 수는 없지만 동일해야합니다.
Frank Conijn 2013 년

2
IE10에서 가장자리 META 태그가있는 쪽에서 이것을 시도했습니다. 일반적으로 "10"을 반환합니다. 모든 사이트에 대해 호환 모드를 강제 설정해도 여전히 "10"이 반환됩니다.
Whelkaholism

IE10 및 IE11 미리보기에서 나를 위해 작동합니다
Simon Keep

20

IE7에는 Trident에 대한 정보가 없습니다.

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8에는 "Trident / 4.0"문자열이 포함됩니다.

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9에는 "Trident / 5.0"문자열이 포함됩니다.

호환성 모드의 IE9 :

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

일반 모드의 IE9 :

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)

1
훌륭합니다. IE10도 트라이던트를 증가시킬까요?
slotishtype

3
Internet explorer 10 사용자 Trident / 6.0 .... blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype

1
및 IE11은 삼지창 / 7.0을 사용
Dee2000


11

IE9가 7, 8 또는 9 모드에 관계없이 존재하고 테스트 할 수있는 속성을 갖기를 바랍니다.

예를 들어 style.opacity를 확인하십시오 . IE9에서 도입되었으며 호환성 모드에 관계없이 사용할 수 있습니다.

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>

1
감사합니다 Dr. Molle, 나는 그것을 시도하고 다시보고 할 것입니다.
Dee2000

안타깝게도 브라우저 모드 (IE9 개발자 도구의 왼쪽 드롭 다운)에서만 작동합니다. 문서 모드 (오른쪽 드롭 다운)에서는 작동하지 않습니다. 문서 모드의 경우 IE9 문서 모드에서만 작동합니다. IE8, IE7 또는 Quirks 모드 인 경우 해당 논리가 실패합니다.
Dee2000 2011

7
젠장, 오른쪽. 나는 다른 속성을 발견 모든 모드에서 나를 위해 작동 : window.performance
Dr.Molle

@ Dee2000 : DocumentMode에서도 작동합니다. 즉, DocumentMode = "Internet Explorer 9 standard"인 경우에만이 테스트가 성공합니다.
Niklas Bäckman 2012 년

@ Dr.Molle 덕분에 window.performance가 일을 훌륭하게 수행합니다.
lewsid

3

때때로 javascript navigator 객체가 아닌 서버 변수에서 사용자 에이전트 문자열을 읽어야합니다.

차이점을 비교하십시오.

  • ASP 클래식, IE11

    • 클라이언트 javascript, navigator.userAgent : " Mozilla / 5.0 (호환 가능, MSIE 9.0, Windows NT 6.1, WOW64, Trident / 7.0, SLCC2, .NET CLR 2.0.50727, .NET CLR 3.5.30729, .NET CLR 3.0.30729, Media Center PC 6.0, .NET4.0C, .NET4.0E, BOIE9, ENUS) "

    • 서버 ASP, Request.ServerVariables ( "HTTP_USER_AGENT") : " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv : 11.0) like Gecko "

  • ASP 클래식, IE11 호환 모드 :

    • 클라이언트 javascript, navigator.userAgent : " Mozilla / 5.0 (호환 가능, MSIE 9.0, Windows NT 6.1, WOW64, Trident / 7.0, SLCC2, .NET CLR 2.0.50727, .NET CLR 3.5.30729, .NET CLR 3.0.30729, Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "

    • 서버 ASP, Request.ServerVariables ( "HTTP_USER_AGENT") : " Mozilla / 4.0 (호환 가능, MSIE 7.0, Windows NT 6.1, WOW64, Trident / 7.0, SLCC2, .NET CLR 2.0.50727, .NET CLR 3.5.30729, .NET) CLR 3.0.30729, Media Center PC 6.0, .NET4.0C, .NET4.0E, BOIE9, ENUS) "


0

에서 https://stackoverflow.com/a/29288153/2879498

ID가 compat-warning 인 숨겨진 요소가 있다고 가정합니다.

jQuery가있는 자바 스크립트 :

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

탐지 및 경고, 호환성 지옥에 대한 첫 번째 및 마지막 방어선.

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