在 IE6 文档模式下可靠地检测 IE7
Reliably Detect IE7 in IE6 document mode
我知道这是一个非常具体、晦涩的问题,所以不要用用例或最佳实践来@我。我知道要测试特定功能的支持。我知道 IE 已经过时了。
在 Windows 服务包更新 (SP3) 之后,IE6 有时会报告为 IE7。我可以通过使用条件编译和功能检测 XMLHttpRequest
可靠地测试 IE6 伪装成 IE7,但我很确定 IE6 文档模式(或老实说,更早的模式)下的 IE7 也会对 XMLHttpRequest
进行负面测试.
有没有办法可靠地确定 IE 的浏览器引擎是 IE6 还是 7,而不考虑文档模式?
根据XMLHttpRequest browser compatibility可以看出XMLHttpRequest支持IE 7+。如果我们想在 IE 5 中使用它,我们应该通过 ActiveXObject('Microsoft.XMLHTTP') 使用它。因此,我们可以使用此功能来检测 IE 7 浏览器。
对于IE6伪装成IE7的问题,我想你可能是在使用userAgent字符串来检测IE浏览器的版本。在我这边测试了UserAgent后,目前看来,如果我们将F12 developer Emulation改为IE 5和IE 7模式,UserAgent字符串如下:
IE 7 模式:“mozilla/4.0(兼容;msie 7.0;windows nt 10.0;wow64;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(兼容;msie 7.0;windows nt 10.0;wow64;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>
结果如下:
因为 Conditional comment 支持从 IE 5 到 IE 9,但在 Internet Explorer 10 和 11 中不支持。因此,您可以使用条件注释来检测 IE 5 ~ IE 9 和使用 UserAgent 检测 IE 10 和 IE 11。
文档模式是 IE8 之前不支持的功能。
所以您需要做的就是检查 IE7 支持但 IE6 不支持的功能。
我知道这是一个非常具体、晦涩的问题,所以不要用用例或最佳实践来@我。我知道要测试特定功能的支持。我知道 IE 已经过时了。
在 Windows 服务包更新 (SP3) 之后,IE6 有时会报告为 IE7。我可以通过使用条件编译和功能检测 XMLHttpRequest
可靠地测试 IE6 伪装成 IE7,但我很确定 IE6 文档模式(或老实说,更早的模式)下的 IE7 也会对 XMLHttpRequest
进行负面测试.
有没有办法可靠地确定 IE 的浏览器引擎是 IE6 还是 7,而不考虑文档模式?
根据XMLHttpRequest browser compatibility可以看出XMLHttpRequest支持IE 7+。如果我们想在 IE 5 中使用它,我们应该通过 ActiveXObject('Microsoft.XMLHTTP') 使用它。因此,我们可以使用此功能来检测 IE 7 浏览器。
对于IE6伪装成IE7的问题,我想你可能是在使用userAgent字符串来检测IE浏览器的版本。在我这边测试了UserAgent后,目前看来,如果我们将F12 developer Emulation改为IE 5和IE 7模式,UserAgent字符串如下:
IE 7 模式:“mozilla/4.0(兼容;msie 7.0;windows nt 10.0;wow64;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(兼容;msie 7.0;windows nt 10.0;wow64;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>
结果如下:
因为 Conditional comment 支持从 IE 5 到 IE 9,但在 Internet Explorer 10 和 11 中不支持。因此,您可以使用条件注释来检测 IE 5 ~ IE 9 和使用 UserAgent 检测 IE 10 和 IE 11。
文档模式是 IE8 之前不支持的功能。
所以您需要做的就是检查 IE7 支持但 IE6 不支持的功能。