提问人:Kithraya 提问时间:6/17/2020 更新时间:8/28/2020 访问量:121
在 IE6 文档模式下可靠地检测 IE7
Reliably Detect IE7 in IE6 document mode
问:
我知道这是一个非常具体、晦涩的问题,所以不要用用例或最佳实践@我。我知道要测试特定于功能的支持。我知道IE已经过时了。
IE6 有时可以在 Windows Service Pack 更新 (SP3) 之后报告为 IE7。我可以通过使用条件编译和功能检测可靠地测试伪装成 IE7 的 IE6,但我很确定 IE6 文档模式(或更早的模式,老实说)中的 IE7 也会测试阴性。XMLHttpRequest
XMLHttpRequest
有没有办法可靠地确定IE的浏览器引擎是IE6还是IE7,而不管文档模式如何?
答:
根据 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>
结果如下:
因为,条件注释支持从 IE 5 到 IE 9,但在 Internet Explorer 10 和 11 中不受支持。因此,您可以使用条件注释来检测 IE 5 ~ IE 9,并使用 UserAgent 来检测 IE 10 和 IE 11。
文档模式是 IE8 之前不支持的功能。
因此,您需要做的就是检查 IE7 中支持的功能,但 IE6 不支持。
评论