检测ie浏览器的新方法,靠谱吗?
new method to detect ie browser , is it reliable?
我听说浏览器嗅探很糟糕,我看到了以下用于检测浏览器是否为 IE 的方法:
var isIe = !!window.ActiveXObject,
它是检测 ie 的可靠方法吗?
我在HERE
等插件中看到过这种方法
除非在极少数情况下(通常处理功能检测不实用的实现错误),否则根据浏览器的品牌或版本做出编程决策被认为是一种糟糕的做法,会导致代码因浏览器而中断改变。
创建一个像 isIE
这样的变量,然后将其用于编程决策,假设所有 isIE
为 true
或 false
的浏览器都具有相同的行为,这正是浏览器检测失败的地方。就是错了。
例如,IE8 不支持 .addEventListener()
,但 IE9 及更高版本支持。然后在 IE11 中,.attachEvent()
被删除。
所以,如果前一段时间,你使用浏览器检测并编写了这样的代码:
if (isIE) {
elem.attachEvent(...);
} else {
elem.addEventListener(...);
}
然后,当 IE 在 IE9 中开始支持 .addEventListener()
时,您的代码将继续使用旧方式。然后,当 .attachEvent()
被删除时 IE11 出现时,您的代码将完全中断,因为您仍在检测 IE 并尝试使用旧方法。因此,您的代码很脆弱,因为它假定检测浏览器类型意味着特定行为,而这根本不是真的。相反,您应该检测行为本身,而不是浏览器的类型。
因此,使用特征检测:
if (elem.addEventListener) {
elem.addEventListener(...);
} else {
elem.attachEvent(...);
}
然后,您的代码将继续在 IE8、IE9、IE10、IE11 等中正常工作...随着浏览器的变化,您的代码不必 "fixed"。
我听说浏览器嗅探很糟糕,我看到了以下用于检测浏览器是否为 IE 的方法:
var isIe = !!window.ActiveXObject,
它是检测 ie 的可靠方法吗?
我在HERE
等插件中看到过这种方法除非在极少数情况下(通常处理功能检测不实用的实现错误),否则根据浏览器的品牌或版本做出编程决策被认为是一种糟糕的做法,会导致代码因浏览器而中断改变。
创建一个像 isIE
这样的变量,然后将其用于编程决策,假设所有 isIE
为 true
或 false
的浏览器都具有相同的行为,这正是浏览器检测失败的地方。就是错了。
例如,IE8 不支持 .addEventListener()
,但 IE9 及更高版本支持。然后在 IE11 中,.attachEvent()
被删除。
所以,如果前一段时间,你使用浏览器检测并编写了这样的代码:
if (isIE) {
elem.attachEvent(...);
} else {
elem.addEventListener(...);
}
然后,当 IE 在 IE9 中开始支持 .addEventListener()
时,您的代码将继续使用旧方式。然后,当 .attachEvent()
被删除时 IE11 出现时,您的代码将完全中断,因为您仍在检测 IE 并尝试使用旧方法。因此,您的代码很脆弱,因为它假定检测浏览器类型意味着特定行为,而这根本不是真的。相反,您应该检测行为本身,而不是浏览器的类型。
因此,使用特征检测:
if (elem.addEventListener) {
elem.addEventListener(...);
} else {
elem.attachEvent(...);
}
然后,您的代码将继续在 IE8、IE9、IE10、IE11 等中正常工作...随着浏览器的变化,您的代码不必 "fixed"。