Javascript 用户代理检测和特征检测的方法、优点和区别是什么?

Javascript 用户代理检测和特征检测的方法、优点和区别是什么?,javascript,css,html,mobile-website,Javascript,Css,Html,Mobile Website,用户代理检测和特征检测的方法、优点和区别是什么?哪一个更好 请给出两者的用法示例。功能检测总是比用户代理检测好,因为用户可以欺骗他们的用户代理字符串,所以它不可靠。使用功能检测而不是用户代理嗅探的主要原因是未来的证据 比方说,您想使用一些新的XMLHttpRequest2.0特性(只是补充一下)。你知道IE不支持,但Firefox支持,所以你的JS中有这样的代码: if (!IE) { UseNewAjax(); } else { UseOldAjax(); } 后来,IE的新

用户代理检测和特征检测的方法、优点和区别是什么?哪一个更好


请给出两者的用法示例。

功能检测总是比用户代理检测好,因为用户可以欺骗他们的用户代理字符串,所以它不可靠。

使用功能检测而不是用户代理嗅探的主要原因是未来的证据

比方说,您想使用一些新的XMLHttpRequest2.0特性(只是补充一下)。你知道IE不支持,但Firefox支持,所以你的JS中有这样的代码:

if (!IE) {
    UseNewAjax();
} else {
    UseOldAjax();
}
后来,IE的新版本出来了,它支持这些新功能,但是因为你是代理嗅探,如果你不修改代码,你的IE浏览器就无法获得这些功能

另一方面,如果使用特征检测:

if (document.hasCoolNewAjax) {
    UseNewAjax();
} else {
    UseOldAjax();
}
您可以放心,如果浏览器支持以前不支持的功能,他们可以立即开始使用这些功能,并且您不必更改代码来支持这些功能

浏览器/用户代理嗅探:使用编程语言确定访问者使用的浏览器,以便针对该浏览器编写特殊逻辑。效率低下,被认为是开发社区的一种不良做法

功能检测:使用编程语言确定浏览器是否支持特定功能。被认为是开发人员社区的最佳实践,因为它是万无一失的,也是未来的证明

来自维基百科:

用户代理嗅探通常被认为是不好的做法,因为它鼓励特定于浏览器的设计,并惩罚具有无法识别的用户代理标识的新浏览器。相反,W3C建议创建标准的HTML标记,[需要引用]允许在尽可能多的浏览器中正确呈现,并测试特定的浏览器功能,而不是特定的浏览器版本或品牌

JavaScript并不是您可以从中进行用户代理嗅探或功能检测的唯一语言。例如,.NET framework的属性允许您读取有关浏览器的各种信息:


除了其他答案给出的其他非常好的理由外,以下是一些psuedo代码,以提供不同类型的示例:

 if (new_feature_available)
 {
    use_new_feature();
 }
 else
 {
    use_old_feature();
 }
VS:


看到这一点,难道功能检测不更有意义吗?

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

这是不可靠的,因为:

  • 用户代理欺骗可以将iPad变成运行IE6的台式PC,反之亦然
  • 用户代理版本/OS版本/JS引擎版本之间的耦合非常低,如果不是完全不存在的话
很难维护,因为:

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

特征检测使代码更简单、更清晰。从某种程度上说,上述代码是从浏览器中抽象出来的,几乎是未来的证明。

用户可以欺骗他们的用户代理字符串
你能解释一下吗,请?但是用户代理切换器是为开发者而不是为普通用户而设计的。有些用户切换他们的用户代理是因为网站希望他们使用特定的浏览器,即使他们知道他们的浏览器可以与网站一起工作。另外,你的论点并没有使用户代理检测更加可靠。@Wesley,还有其他问题。这三个都是错误的做法(UA嗅探、不支持非JS以及不保护againts SQL注入)。对同一个人都有坏处reasons@JitendraVyas ;_; 服务器端UA检测是个难题。不要根据你认为你的客户是谁而向他发送不同的内容。发送被问到的内容。Eli-你能用简单的方式解释这两个术语吗?特别是在IE的情况下,用户代理检测不也包括版本检测吗?如果是这样的话,那么说功能不会在同一版本的浏览器中发生变化难道不公平吗?这是一种可能性,但既然你可以用一种方式编写一次代码并使其始终工作,为什么还要冒险呢?@Eli-那么功能检测是否只能在客户端(Javascript)中进行?我没有过多研究,但这里有一件有趣的事情:但我认为功能检测会让代码变得沉重,因为所有的代码对于
旧的
新的功能
,都在同一个文件中,而在UA检测中,我们可以将内容保存在单独的文件中,并交付给特定的浏览器。@JitendraVyas:这取决于你的问题。这(特性检测)基本上就是jQuery对许多特性所做的。但我认为功能检测会使代码变得繁重,因为所有代码对于新旧功能都在同一个文件中,而在UA检测中,我们可以将内容保存在单独的文件中,并交付给特定的浏览器。@据我所知,Vyas是唯一的(客户端)为不同浏览器指定不同文件的方法是使用条件注释,这只适用于Internet Explorer。在任何情况下,避免“繁重的代码”的愿望都不能成为代码草率的借口,用户代理检测也是草率的。@Vyas-如果项目严重依赖最新版本的JS引擎中可用的最新功能,并且希望使其向后兼容,则功能检测会使代码变得繁重。有了这样一个策略,你的项目就会崩溃,维护起来会是一场噩梦。如果您主要使用常规的东西,那么您将只在一些通用的地方使用特性检测,比如事件管理器和ajax方法或其他东西。您的代码将是干净、高效和经得起未来考验的。把它放在一个文件里一点也不重要。
// 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();
 }