我听说浏览器嗅探很糟糕,我看到以下用于检测浏览器是否为IE的方法:
var isIe = !!window.ActiveXObject,
它是一种可靠的检测方法吗?
我在插件中使用过这种方法,例如 HERE
答案 0 :(得分:1)
除了非常罕见的情况(通常处理功能检测不实用的实现错误)之外,根据浏览器的品牌或版本做出编程决策被认为是一种糟糕的做法,导致代码随着浏览器的变化而中断。
创建类似isIE
的变量,然后将其用于编程决策,假设所有isIE
true
false
或.addEventListener()
的浏览器都具有相同的行为这正是浏览器检测失败的地方。这是错的。
例如,IE8不支持.attachEvent()
,但IE9及更高版本支持if (isIE) {
elem.attachEvent(...);
} else {
elem.addEventListener(...);
}
。然后在IE11中删除了.addEventListener()
。
所以,如果不久前,您使用浏览器检测并编写如下代码:
.attachEvent()
然后,当IE开始在IE9中支持if (elem.addEventListener) {
elem.addEventListener(...);
} else {
elem.attachEvent(...);
}
时,您的代码将继续使用旧方法。然后,当IE11在移除#
时出现时,您的代码将完全中断,因为您仍然在检测IE并尝试使用旧方法。因此,您的代码很脆弱,因为它假设检测浏览器类型意味着特定的行为,这根本就不是真的。相反,您应该检测行为本身,而不是浏览器的类型。
所以,使用特征检测:
});
然后,您的代码只是继续在IE8,IE9,IE10,IE11等中继续工作......您的代码不必在浏览器更改时“修复”。