Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Differentiate IE7 browser and browser in IE7 compatibility mode

Can I differentiate if client's browser is IE7 or e.g. IE9 in IE7 compatibility mode? I'm trying to figure out if I can do a JS check on my site which would recognize two different things and do different stuff depending on the result

  1. that browser is IE7
  2. that browser is in IE7 compatibility mode

I have the first condition working correctly as it's pretty much said everywhere how to do it. Not sure about the second one and/or combination of both.

like image 640
vault-boy Avatar asked Apr 18 '12 16:04

vault-boy


People also ask

What does Internet Explorer compatibility mode mean?

Compatibility View is a feature of Windows Internet Explorer 8 that enables the browser to render a webpage nearly identically to the way that Windows Internet Explorer 7 would render it.

What does ie11 compatibility mode do?

We created Internet Explorer (IE) mode in Microsoft Edge for organizations that still need Internet Explorer 11 for backward compatibility with existing websites but also need a modern browser. This feature makes it easier for organizations to use one browser, for legacy web/apps or for a modern web/app.

How do I run IE in compatibility mode Chrome?

On the IE Tab Options and Settings page, scroll down to IE Compatibility Mode and click IE 11 Standards Mode.


2 Answers

For at least IE8 and IE9, you can check whether navigator.userAgent has the substring Trident in it. An IE8+ always has a Trident in its user-agent, where an IE7 doesn't. See this answer and the MSDN link in it.

IE10 seems trickier: it is reported in the comments below that Trident is not always present with IE7 emulation mode. Probably the OS string (eg. Windows NT 6.2) will still reveal IE10, if IE10 will not be available on any platform where IE7 is available.

Please also note that the HTTP User-Agent header might not always match navigator.userAgent. This is the case at least with IE9 that has compatiblity mode on (sends an IE7 User-Agent header) but detects something like IE=Edge in the response (navigator.userAgent turns back to IE9).

like image 91
tuomassalo Avatar answered Oct 30 '22 11:10

tuomassalo


I don't believe there is a way to detect if the user's browser is in compat mode. Their user agent string will be determined by their browser mode, and their document mode will be determined by either the presence of an x-ua-compatible meta tag (or header), or possibly by the doctype used.

Compatibility Mode was meant to protect the modern-browser-user from pages that relied on old and outdated features or hacks. It's not really something you would want to test against. Instead, write standards-compliant code which will be understood by the browser in either compat mode, or non-compat mode.

Here are the various results of differing Browser Modes and Document Modes:

Browser Mode: IE10 Compat View / Document Mode: IE7 standards

navigator.userAgent
 
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; 
.NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; 
.NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2)" 

document.documentMode

7

Browser Mode: IE7 / Document Mode: IE7 standards

navigator.userAgent

"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E; 
.NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; 
.NET CLR 3.0.30729; BRI/2)"

document.documentMode

7

As you can see, by these two methods there is no way to tell if the user is in compat view or not.

Overriding Compat View List

If your site appears on the compatibility view list, you can override their suggested rendering options by providng your own x-ua-compatible header:

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

This forces your browser into IE9 Standards Mode (no evaluation of the doctype). You could use IE=edge to force it into the latest mode possible (on Internet Explorer 10, this would be IE 10 Standards), but this is not encouraged. Instead, set it to the latest mode you've tested with.

If the x-ua-compatible header is set to IE10, but the user visits your page on an earlier browser, the nearest rendering engine will be used. For instance, if the user visits your page with IE9, and your meta tag instructs the browser to use IE10, the browser will fallback to IE9 Standards mode.

Note that IE=9 causes the browser to go into IE9 Standards Mode. It doesn't necessarily cause the browser to behave as though it were IE9. If you want the browser to behave as though it were IE9, you would want to use the EmulateIE9 content:

<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />

This causes the browser to fallback on the DOCTYPE, if it's present, to determine whether the document mode will be Standards, or Quirks.

For further information, see Defining Document Compatibility.

like image 45
Sampson Avatar answered Oct 30 '22 11:10

Sampson