用户代理检测和特征检测之间的手段,好处和差异是什么?

时间:2011-05-23 16:20:47

标签: javascript css html5 mobile-website

用户代理检测和功能检测之间的手段,好处和差异是什么?哪一个更好?

请为两者提供示例。

4 个答案:

答案 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框架具有允许您读取有关浏览器的各种信息的属性:

http://msdn.microsoft.com/en-us/library/3yekbd5b.aspx

http://modernizr.com

答案 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)

浏览器嗅探不可靠且难以维护。

这是不可靠的,因为:

  • 用户代理欺骗可以将iPad变成运行IE6的台式PC,反之亦然
  • 用户代理版本/操作系统版本/ JS引擎版本之间的耦合(如果不是完全不存在的话)非常低

很难维护,因为:

  • 用户代理一直在进化,迫使你分叉和分叉
  • 您的代码与特定的浏览器/引擎紧密耦合,导致许多妥协和解决方法
  • 您的代码主要基于假设,因此非常脆弱

功能检测使代码更简单,更清晰。所述代码在某种程度上是从浏览器中抽象出来的,几乎完全是面向未来的。