在 IE6 文档模式下可靠地检测 IE7

Reliably Detect IE7 in IE6 document mode

提问人:Kithraya 提问时间:6/17/2020 更新时间:8/28/2020 访问量:121

问:

我知道这是一个非常具体、晦涩的问题,所以不要用用例或最佳实践@我。我知道要测试特定于功能的支持。我知道IE已经过时了。

IE6 有时可以在 Windows Service Pack 更新 (SP3) 之后报告为 IE7。我可以通过使用条件编译和功能检测可靠地测试伪装成 IE7 的 IE6,但我很确定 IE6 文档模式(或更早的模式,老实说)中的 IE7 也会测试阴性。XMLHttpRequestXMLHttpRequest

有没有办法可靠地确定IE的浏览器引擎是IE6还是IE7,而不管文档模式如何?

7 互联网浏览器- 6

评论


答:

1赞 Zhi Lv 6/17/2020 #1

根据 XMLHttpRequest 浏览器的兼容性,我们可以看到 XMLHttpRequest 支持 IE 7+。如果我们想在IE 5中使用它,我们应该通过ActiveXObject('Microsoft.XMLHTTP')使用它。因此,我们可以使用此功能来检测 IE 7 浏览器。

对于伪装成 IE7 的 IE6,我想您可能正在使用 userAgent 字符串来检测 IE 浏览器版本。在我这边测试了UserAgent之后,目前看来,如果我们将F12开发者仿真改为IE 5和IE 7模式,UserAgent字符串如下:

  • IE 7 模式:“mozilla/4.0(兼容;微信 7.0;视窗 NT 10.0;哇64;Trident/7.0、.net4.0c、.net4.0e、.NET CLR 2.0.50727、.NET CLR 3.0.30729、.NET CLR 3.5.30729) "

  • IE 5 模式:“mozilla/4.0(兼容;微信 7.0;视窗 NT 10.0;哇64;Trident/7.0、.net4.0c、.net4.0e、.NET CLR 2.0.50727、.NET CLR 3.0.30729、.NET CLR 3.5.30729) "

正如我们所看到的,他们使用相同的UserAgent,似乎在IE 5模式下,Internet Explorer使用“MSIE 7.0”更改了其用户代理。

我还尝试使用条件注释来检测IE浏览器版本,似乎它在IE 5 +上运行良好。

请检查以下示例:

<center>
    <h1 style="color:blue">How to detect IE</h1>
    <script>
        //detects if user is using Internet Explorer based on the userAgent
        //returns version of IE or false, if browser is not IE
        //Function to detect IE or not
        function IEdetection() {
            var ua = window.navigator.userAgent;
            var msie = ua.indexOf('MSIE ');
            if (msie > 0) {
                // IE 10 or older, return version number
                return ('IE ' + parseInt(ua.substring(
                    msie + 5, ua.indexOf('.', msie)), 10));
            }
            var trident = ua.indexOf('Trident/');
            if (trident > 0) {
                // IE 11, return version number
                var rv = ua.indexOf('rv:');
                return ('IE ' + parseInt(ua.substring(
                    rv + 3, ua.indexOf('.', rv)), 10));
            }
            var edge = ua.indexOf('Edge/');
            if (edge > 0) {
                //Edge (IE 12+), return version number
                return ('IE ' + parseInt(ua.substring(
                    edge + 5, ua.indexOf('.', edge)), 10));
            } 
            // User uses other browser
            return ('Not IE');
        }
        var result = IEdetection();
        document.write("UserAgent: <br/>");
        document.write(window.navigator.userAgent);

        document.write("<br/>Using UserAgent detection, result: <br/>");
        document.write(result);


        var ie = (function () {
            if (window.ActiveXObject === undefined) return null; //Not IE
            if (!window.XMLHttpRequest) return 6;
            if (!document.querySelector) return 7;
            if (!document.addEventListener) return 8;
            if (!window.atob) return 9;
            if (!document.__proto__) return 10;
            return 11;
        })();
        document.write("<br/>Using feature detection, Result:<br/>");
        document.write(ie);
    </script>


<!--[if IE 5]>
<p class="ieversion" data_version="5">You are using Internet Explorer 5.</p>
<![endif]-->
<!--[if IE 7]>
<p class="ieversion" data_version="7">You are using Internet Explorer 7.</p>
<![endif]-->
<!--[if IE 9]>
<p class="ieversion" data_version="9">You are using Internet Explorer 9.</p>
<![endif]-->

    <script>
        if (!document.getElementsByClassName) {
            document.getElementsByClassName = function (search) {
                var d = document, elements, pattern, i, results = [];
                if (d.querySelectorAll) { // IE8
                    return d.querySelectorAll("." + search);
                }
                if (d.evaluate) { // IE6, IE7
                    pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
                    elements = d.evaluate(pattern, d, null, 0, null);
                    while ((i = elements.iterateNext())) {
                        results.push(i);
                    }
                } else {
                    elements = d.getElementsByTagName("*");
                    pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
                    for (i = 0; i < elements.length; i++) {
                        if (pattern.test(elements[i].className)) {
                            results.push(elements[i]);
                        }
                    }
                }
                return results;
            }
        }
        var item = document.getElementsByClassName("ieversion");
        if (item.length > 0) {
            document.write("<br />Using Conditional comment + JavaScript, result:<br/>");
            document.write("IE version: " + item[0].getAttribute("data_version"));
        }
    </script>
</center>

结果如下:

enter image description here

因为,条件注释支持从 IE 5 到 IE 9,但在 Internet Explorer 10 和 11 中不受支持。因此,您可以使用条件注释来检测 IE 5 ~ IE 9,并使用 UserAgent 来检测 IE 10 和 IE 11。

0赞 Kithraya 8/28/2020 #2

文档模式是 IE8 之前不支持的功能。

因此,您需要做的就是检查 IE7 中支持的功能,但 IE6 不支持。