用户代理检测和功能检测之间的手段,好处和差异是什么?哪一个更好?
请为两者提供示例。
答案 0 :(得分:6)
使用特征检测而不是用户代理嗅探的主要原因是未来验证。
例如,假设您想要使用一些新的XMLHttpRequest 2.0功能(只是这样做)。你知道IE不支持它,但是Firefox支持它,所以你在JS中有这样的代码:
if (!IE) {
UseNewAjax();
} else {
UseOldAjax();
}
后来出现了支持新功能的新版IE,但由于你是代理嗅探器,你的IE浏览器无法在不改变代码的情况下获得此功能。
另一方面,如果您具有检测功能:
if (document.hasCoolNewAjax) {
UseNewAjax();
} else {
UseOldAjax();
}
您可以放心,如果浏览器支持以前没有的功能,他们可以立即开始使用这些功能,而您无需更改代码即可支持它。
浏览器/用户代理嗅探:使用编程语言确定访问者正在使用的浏览器,因此可以针对该浏览器编写特殊逻辑。在开发社区中效率低下并被认为是一种不好的做法。
功能检测:使用编程语言确定浏览器是否支持特定功能。被认为是开发者社区的最佳实践,因为它是万无一失的,面向未来。
来自维基百科:
用户代理嗅探主要被认为是不好的做法,因为它鼓励特定于浏览器的设计并使用无法识别的用户代理标识惩罚新浏览器。相反,W3C建议创建标准的HTML标记,[引证需要]允许在尽可能多的浏览器中正确呈现,并测试特定的浏览器功能,而不是特定的浏览器版本或品牌。
JavaScript不是用户代理嗅探或特征检测的唯一语言。例如,.NET框架具有允许您读取有关浏览器的各种信息的属性:
答案 1 :(得分:2)
功能检测始终优于用户代理检测,因为用户可以欺骗用户代理字符串,因此它不可靠。
答案 2 :(得分:1)
除了其他答案给出的其他非常好的理由之外,这里有一些伪代码可以给出一个不同的例子:
if (new_feature_available)
{
use_new_feature();
}
else
{
use_old_feature();
}
VS
// We had to look up what features are available in each to make this list
// There are probably browsers we're missing here as well...
// TODO: Make this list really big and include all known browsers
// TODO: Double check that this feature is not supported in listed browsers
if (
browser not IE5, IE6, IE7, Opera8, Firefox1.8, Seamonkey,
OR browser is Chrome10, Firefox4, IE9
)
{
use_new_feature();
}
else
{
use_old_feature();
}
看到这一点,特征检测没有意义吗?
答案 3 :(得分:0)
浏览器嗅探不可靠且难以维护。
这是不可靠的,因为:
很难维护,因为:
功能检测使代码更简单,更清晰。所述代码在某种程度上是从浏览器中抽象出来的,几乎完全是面向未来的。