检测IE10兼容模式

14

我有一些特定于IE 10和其他IE版本的代码路径。如果IE 10以兼容模式运行,则浏览器版本设置为7.0。是否有一种使用JavaScript / JQuery检测是否为IE 10,而不考虑标准/兼容模式的方法?


1
兼容模式的整个意义在于它应该假装成IE7,因此所有正常的版本检测技巧都会显示“IE7”。话虽如此,您可以使用一些技巧,并且这里有几个类似的问题可能已经给出了答案...请参见https://dev59.com/X3M_5IYBdhLWcg3wjj4p,https://dev59.com/HG025IYBdhLWcg3wvIq2等(我知道这些是针对IE8和IE9的,但其中的一些提示可能会有所帮助?) - Spudley
1
@Spudley,我猜测trident是检测的方法。 - ABC
1
出于好奇,你为什么需要检测兼容模式呢?通过使用适当的元标签,您应该能够避免用户在兼容模式下运行,所以我不知道为什么您需要检测它。 - Spudley
是的,我想 User-Agent 字符串应该是需要查看的地方。 - Spudley
4个回答

21
您可以使用 navigator.userAgent 字符串来检测此问题,例如:

"Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.2;WOW64; Trident/6.0;.NET4.0E;.NET4.0C;InfoPath.3;.NET CLR 3.5.30729;.NET CLR 2.0.50727;.NET CLR 3.0.30729;Zune 4.7)"

Trident/6.0 表示 IE10

MSIE 7.0 表示兼容模式

更多详细信息请参见:https://dev59.com/HG025IYBdhLWcg3wvIq2#5825518


4
如果您通过开发工具将其放入兼容性视图中,这似乎是正确的。如果它因为“工具”菜单中“兼容性视图设置”(例如通过域名)而被放入兼容性视图,它似乎使用正常的标准userAgent。 - Craig Celeste

12

这应该可以检测到MSIE的兼容模式。

iecheck.js

function trueOrFalse() {
    return true;
}

function IeVersion() {
    //Set defaults
    var value = {
        IsIE: false,
        TrueVersion: 0,
        ActingVersion: 0,
        CompatibilityMode: false
    };

    //Try to find the Trident version number
    var trident = navigator.userAgent.match(/Trident\/(\d+)/);
    if (trident) {
        value.IsIE = true;
        //Convert from the Trident version number to the IE version number
        value.TrueVersion = parseInt(trident[1], 10) + 4;
    }

    //Try to find the MSIE number
    var msie = navigator.userAgent.match(/MSIE (\d+)/);
    if (msie) {
        value.IsIE = true;
        //Find the IE version number from the user agent string
        value.ActingVersion = parseInt(msie[1]);
    } else {
        //Must be IE 11 in "edge" mode
        value.ActingVersion = value.TrueVersion;
    }

    //If we have both a Trident and MSIE version number, see if they're different
    if (value.IsIE && value.TrueVersion > 0 && value.ActingVersion > 0) {
        //In compatibility mode if the trident number doesn't match up with the MSIE number
        value.CompatibilityMode = value.TrueVersion != value.ActingVersion;
    }
    return value;
}

iecheck.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Testing IE Compatibility Mode</title>
    <script src="iecheck.js" type="text/javascript"></script>
</head>
<body>
<div id="results">Results: </div>
</br>
<script type="text/javascript">

var ie = IeVersion();

document.write("IsIE: " + ie.IsIE + "</br>");
document.write("TrueVersion: " + ie.TrueVersion + "</br>");
document.write("ActingVersion: " + ie.ActingVersion + "</br>");
document.write("CompatibilityMode: " + ie.CompatibilityMode + "</br>");

</script>
</body>
</html>

6
用户代理字符串中的Trident值表示正在运行的IE实际版本。

5
这是我从JQuery中使用的.ready函数。
  $(document).ready(function () {
    var iec = new IECompatibility();
    alert('IsIE: ' + iec.IsIE + '\nVersion: ' + iec.Version + '\nCompatability On: ' + iec.IsOn);
  });

  function IECompatibility() {
    var agentStr = navigator.userAgent;
    this.IsIE = false;
    this.IsOn = undefined;  //defined only if IE
    this.Version = undefined;

    if (agentStr.indexOf("MSIE 7.0") > -1) {
      this.IsIE = true;
      this.IsOn = true;
      if (agentStr.indexOf("Trident/6.0") > -1) {
        this.Version = 'IE10';
      } else if (agentStr.indexOf("Trident/5.0") > -1) {
        this.Version = 'IE9';
      } else if (agentStr.indexOf("Trident/4.0") > -1) {
        this.Version = 'IE8';
      } else {
        this.IsOn = false; // compatability mimics 7, thus not on
        this.Version = 'IE7';
      }
    } //IE 7
  }

Ben Hobgood

1
我认为你的代码只有在UA字符串中检测到兼容模式时才设置IsIE和Version。这是有意为之的吗? - ifugu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接