internet-explorer 보기 - 인트라넷 호환성 모드 IE8 재정의




강제 설정 (17)

문서 모드 대 브라우저 모드에 대한 Stefan S의 의견은 내 문제와 관련이 있습니다.

페이지에 X-UA-Content 메타 데이터가 있지만 브라우저 측에서 navigator.appVersion 통해 브라우저 버전을 테스트했습니다. 이 테스트는 브라우저 모드에 문서 모드가 아니므로 메타 데이터를 반영하지 않습니다.

대답은 document.documentMode 다음과 같이 테스트하는 것이 었습니다.

function IsIE(n)
{
    if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
    var sDocMode = document.documentMode;
    return (isFinite(sDocMode) && sDocMode==n);
}

이제 메타 X-UA-meta 태그는 브라우저 테스트에 반영됩니다.

왜 나는 브라우저를 테스트하는 것과 같은 이상한 일을합니까? 속도. 다양한 jQuery 추가 기능 (예 : 테이블 작성기)은 IE6 / 7에서 너무 느려서 해제하고 싶습니다. 브라우저 기능 테스트를 통해이 문제를 해결할 수 있는지 확신 할 수 없습니다.

기본적으로 IE8은 인트라넷 웹 사이트를 호환 모드로 만듭니다. 메타 헤더를 ​​IE8로 변경하려고했지만 메타 헤더를 ​​확인하지 않고 브라우저 설정 만 사용합니다. 아무도 이것을 해제하는 방법을 알고 있습니까?


나는이 문제에 어려움을 겪었으며 독특한 해결책과 통찰력을 제공하고자했습니다.

특정 AJAX 기반 프레임 워크는 <head> 시작 부분에 javascript와 스타일 시트를 삽입하며, 이렇게하면 제대로 설정된 메타 태그 솔루션이 제대로 작동하지 않는 것으로 보입니다. 이 경우에는 Andras Csehi의 답변이 문제를 해결할 것 인 것처럼 HTTP 응답 헤더에 직접 삽입하는 것을 발견했습니다.

자바 서블릿을 사용하는 사람들에게는 ServletFilter를 사용하는 것이 좋습니다.

public class EmulateFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletResponse response = ((HttpServletResponse)arg1);
    response.addHeader("X-UA-Compatible", "IE=8");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

Google 시스템 관리자가이 문제를 해결하기 위해 조직의 전체적인 확인란을 선택 취소했습니다. 사용자는 로그 오프 할 필요조차 없었습니다.


메타 태그를 머리 부분의 첫 번째 태그로 지정하여 호환 모드를 무시할 수있었습니다 . 첫 번째 메타 태그뿐만 아니라 매우 첫 번째 태그 로만 사용되었습니다.

@ stefan.s에게 감사의 말을 전합니다. 읽기 전에 :

이것은 작동하지 않았다.

<head> 
<link rel="stylesheet" type="text/css" href="/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >

링크 태그를 방해하지 않고 작동 시켰습니다.

이 작품 :

<head><meta http-equiv="x-ua-compatible" content="IE=9" >

따라서 호환성을 사용하도록 설정된 IE8 클라이언트는 페이지를 IE8 표준 모드로 렌더링합니다. content = 'IE = 9'는 IE9까지 사용할 수있는 가장 높은 표준을 사용한다는 것을 의미합니다.


웹 사이트가 IE 8 표준 모드를 ​​사용하도록하려면이 메타 태그를 유효한 DOCTYPE과 함께 사용하십시오.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

일반 "IE8"보다는 "EmulateIE8"값에 유의하십시오.

IE devs에 따르면 "표준 DOCTYPE을 IE8 표준 모드로 표시하고, 단점 모드에서 단점 DOCTYPE을 표시합니다.이 태그를 사용하여 클라이언트 컴퓨터의 호환성보기를 무시하고 표준을 IE8 표준으로 강제 설정하십시오."

이 IE 블로그 게시물에 대한 자세한 정보 : http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx


이 질문에 대한 답변에는 다소 혼란이 있습니다.

가장 큰 대답은 현재 http 헤더에 플래그를 설정하는 서버 측 솔루션이며 일부 주석은 메타 태그를 사용하는 솔루션이 작동하지 않는다는 것을 나타냅니다.

이 블로그 항목은 호환성 메타 정보를 사용하는 방법에 대한 좋은 개요를 제공하고 내 경험에 따르면 다음과 같이 설명합니다 : http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx

주요 요점 :

  • 메타 태그를 사용하여 정보를 설정하고 헤더에서 둘 다 작동합니다.
  • 메타 태그는 헤더보다 우선합니다
  • 메타 태그는 브라우저가 경험적 방법을 기반으로 이전에 렌더링 엔진을 결정하지 않도록하는 첫 번째 태그 여야합니다.

하나의 중요한 점은 (그리고 나는 많은 혼란이이 시점에서 비롯된다고 생각한다.) IE에는 모드의 두 가지 "클래스"가있다.

  1. 문서 모드
  2. 브라우저 모드

문서 모드는 렌더링 엔진 (웹 페이지 렌더링 방법)을 결정합니다.

브라우저 모드는 UA (User-Agent) 문자열 IE가 서버로 보내는 내용, 문서 모드 IE의 기본값 및 IE가 조건부 주석을 평가하는 방식을 결정합니다.

문서 모드 대 브라우저 모드에 대한 자세한 내용은이 기사에서 확인할 수 있습니다. http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx?Redirected=true

내 경험에 의하면 호환성 메타 데이터는 문서 모드에만 영향을 미칩니다 . 따라서 브라우저 검색에 의존한다면이 방법이 도움이되지 않습니다. 그러나 당신이 기능 탐지를 사용한다면 이것은 갈 길입니다.

따라서이 구문을 사용하여 HTML 태그에서 meta 태그를 사용하는 것이 좋습니다.

<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>

주의 사항 : 테스트 한 브라우저 모드 목록을 제공하십시오.

블로그 게시물은 EmulateIEX 사용에 대한 조언도 제공합니다. 여기에 인용구 :

즉, 응용 프로그램에서 EmulateIE7 또는 EmulateIE8을 요청할 때 이상한 점을 발견했습니다. 이러한 에뮬레이트 모드 자체가 결정입니다. 그래서, 당신이 원하는 것을 구체적으로 표현하는 대신에, 두 가지 중 하나를 요구하고, DOCTYPE 코드의 다른 부분을보고 (그리고 DOCTYPE이 당신에게 표준을 줄 것인지 또는 그 내용에 따라 기묘함 - 때때로 다른 혼란스러운 작업). 오히려 그 자체로 문제가되는 응답을주는 것보다 원하는 것을 직접 지정하는 것이 훨씬 더 의미가 있다고 생각합니다. IE7 표준을 원하면 IE = EmulateIE7 대신 IE = 7을 사용하십시오. (이것이 DOCTYPE을 사용해서는 안된다는 의미는 아닙니다.


이것을 당신의 페이지 헤드 태그 안에 추가하십시오 (당신이 원하는 IE 버전을 목표로 함) :

<meta http-equiv="X-UA-Compatible" content="IE=8" />  

브라우저가 호환성 모드 (브라우저 모드라고 함) 에서 말하는 사실은 변경되지 않지만 IE8 표준 모드에서 페이지 렌더링됩니다. 그것의 정지가 당신이 바라는 방식으로 렌더링하지 않는다면 아마 IE 버전을 잘못 체크하고있는 자바 스크립트가 있기 때문일 것입니다. meta-X-UA-Compatible 태그를 설정하더라도 사용자 에이전트 문자열이 여전히 MSIE 7.0을 말하기 때문에 blogs.msdn.com/b/mikeormond/archive/2008/09/25/… 을 참조하십시오.

필자의 경우 IE7 호환성 모드에 대한 점검을 추가해야했습니다. 나는 간단한 자바 스크립트 코드를 사용했다.

                //IE8 and later will have the word 'trident' in its user agent string.
                if (navigator.userAgent.indexOf("Trident")>-1) { //do something }

Michael Irigoyen은 정확하지만 좀 더 복잡합니다 ...

Paul Irish가 제공 한 훌륭한 상용구를 사용한다면 다음과 같은 것을 얻을 수 있습니다 : -

<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

이 옵션은 예상대로 작동하지 않으며 "호환성보기에서 인트라넷 사이트 표시"를 선택한 경우 IE에서 인트라넷 환경의 호환 모드로 강제 실행됩니다. 인트라넷 호환 모드를 방지하려면 조건부 IE 주석을 제거해야합니다.

그래서 다음 코드가 작동합니다 :

<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

기본적으로 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 문 앞에 조건부 IE 주석을 트리거하면 인트라넷 환경에서 강제로 호환 모드로 전환됩니다 기본 설정으로 IE9를 실행합니다.

업데이트 - 추가 정보 : 그러나 HTML5 보일 플레이트가 작동하게하는 트릭이 있음을 유의하십시오.

DOCTYPE 앞에 emtpy, 조건부 주석을 추가하십시오. 또한 그렇게 할 때 X-UA-Compatible 지시문에 조건부 주석을 추가하여 X-UA-Compatible 페이지를 유효하게 만들 수 있습니다. 그래서 예를 들면 :

<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

이 답변의 첫 번째 부분에서 영감을받은 블로그 게시물 에는 세부 정보가 있습니다. 그런데 : 블로그 게시물에서 언급했듯이 DOCTYPE 앞에있는 조건부 주석을 조건없는 준 조건부 주석으로 대체 할 수도 있습니다 : <!--[]--> . 따라서 다음과 같이하십시오.

<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

그러나 후자의 변형 ( <--[]--><!DOCTYPE html> )은 예를 들어 다른 질문에 대한이 대답 으로 설명했듯이 X-UA-Compatioble 대한 지원이없는 레거시 IE 버전의 경우 잘 알려진 문제를 활성화합니다 X-UA-Compatioble (IE7 및 IE6 용) - 브라우저를 버릇없는 모드로 전환합니다.


헤더에 다음을 입력하십시오.

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Courtesy Paul Irish의 HTML5 상용구 (XHTML Transitional에서도 작동).


같은 문제가있었습니다. 그것은

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />

"도구"메뉴를 풀고 "호환성보기 설정"을 선택하면 맨 아래 대화 상자는 "호환성 모드에서 인트라넷 사이트 표시"설정입니다. 이 옵션을 선택 취소하면 문제가 해결되고 IE는 DOCTYPE을 기반으로 모드를 사용합니다.



이 질문은 인트라넷에서 강제로 "Internet Explorer 8"브라우저 모드와 중복됩니다.

거기에있는 응답은 호환성보기를 비활성화 할 수 없음을 나타냅니다 (서버 측) - https://.com/a/4130343/24267 . 그것은 분명히 내가 시도한 제안들 중 어느 것도 효과가 없었던 것처럼 보인다. Internet Explorer 8에서는 어떤 종류의 X-UA 호환 헤더를 보내도 "브라우저 모드"가 Internet Explorer 8 호환성보기로 설정됩니다.

나는 IE7과 호환 모드를위한 특별한 처리를해야했다. IE8을 사용하여 브라우저를 렌더링하지만 그것이 IE7이라고보고하고 코드를 위반했다. 이것이 내가 코드를 수정 한 방법이다. (이것은 끔찍한 해킹이다. 브라우저 버전이 아닌 기능을 테스트해야한다.)

isIE8 = navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 8;
if (!isIE8 && navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 7 && navigator.appVersion.indexOf("Trident") != -1) {
    // Liar, this is IE8 in compatibility mode.
    isIE8 = true;
}

이것은 정확하게 해결책은 아니지만, 나는 그것이 최선이라고 생각합니다. 인트라넷 사이트에서는 파이어 폭스에서만 액세스 할 수 있다고 말하고 있지만 여기서는 IE 사용자에게 아무런 도움이되지 않습니다. 서버 또는 클라이언트 측의 사용자 에이전트를 확인하고 IE로부터의 액세스를 거부하십시오. 그리고 저는 .NET 프로그래머입니다.


인트라넷의 호환성 모드를 재정의 할 수 있습니다.

IIS의 경우 web.config에 아래 코드를 추가하면됩니다. IE9에서 저를 위해 일했습니다.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <clear />
      <add name="X-UA-Compatible" value="IE=edge" />
    </customHeaders>
  </httpProtocol>
</system.webServer> 

아파치와 동일하다.

Header set X-UA-Compatible: IE=Edge

그리고 nginx 들어 :

add_header "X-UA-Compatible" "IE=Edge";

express.js의 경우 :

res.set('X-UA-Compatible', 'IE=Edge')

이 메타 태그 시도 :

<meta http-equiv="X-UA-Compatible" content="IE=8" />

"인트라넷 또는 모든 웹 사이트에 대해"[인트라넷 사이트를 호환성보기로 표시]가 선택되어 있어도 IE8을 IE8 표준 모드로 렌더링하도록 강제해야합니다. IE 8.0.6에서 자체적으로 시도했습니다.


나는 또한 IE7에서 로컬 호스트에 대한 IE7 문서 표준과 동일한 문제를 가지고있다. 많은 조건부 주석 태그를 시도했지만 불만족 스럽습니다. 결국 나는 모든 조건부 태그를 제거하고 아래처럼 머리 부분 뒤에 메타 태그를 추가했습니다. 매력적이었습니다.

<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

희망이 도움이된다.





internet-explorer internet-explorer-8 intranet compatibility-mode