我将暂时扮演一个魔鬼的拥护者。我一直在想为什么浏览器检测(与特征检测相反)被认为是一种不好的做法。如果我测试某个版本的某个浏览器并确认,某个功能的行为是以某种可预测的方式进行的,那么决定做特殊情况似乎没问题。原因在于它将来会万无一失,因为这部分浏览器版本不会改变。另一方面,如果我检测到DOM元素具有函数X,则不一定意味着:
我只是偷看了jQuery源代码,他们通过将精心构建的HTML片段插入DOM中进行特征检测,然后检查它是否具有某些功能。这是一种明智而坚实的方式,但我会说,如果我在我的小小的个人JavaScript(没有jQuery)中做了类似的事情,那将会有点太沉重。它们还具有几乎无限的QA资源的优势。另一方面,你经常看到人们做的是检查函数X是否存在,然后基于此,他们假设函数在所有具有此函数的浏览器中都会以某种方式运行。
我没有说任何意义上的功能检测不是一件好事(如果使用得当),但我想知道为什么浏览器检测通常会立即被解雇,即使它听起来合乎逻辑。我想知道这是否是另一个时髦的事情。
答案 0 :(得分:26)
在我看来,自从几年前Resig this post以来,浏览器检测已经被人们广泛接受了。然而,Resig的评论特定于库/框架代码,即其他[特定于域]的应用程序/站点将消费的代码。
我认为功能检测毫无疑问是适合库/框架的 。对于特定于域的应用程序,我不太确定浏览器检测是否那么糟糕。它适用于解决难以进行特征检测的已知浏览器特性,或适用于在功能本身实现中存在缺陷的浏览器。浏览器检测适当的时间:
也就是说,在进行浏览器检测时,有一些major pitfalls(可能由我们大多数人承诺)。
答案 1 :(得分:23)
Here's a good article解释了特征检测如何在浏览器嗅探方面的优势。
事实上,嗅探非常脆弱。它在理论上很脆弱,因为它依赖于任意userAgent
字符串,然后实际上将该字符串映射到某个行为。正如时间所示,它在实践中也很脆弱。测试几十个浏览器的每个主要版本和次要版本并试图解析其中一些版本的版本号根本不实用;另一方面,测试怪癖的某些行为要强得多。例如,功能测试经常捕获浏览器供应商偶然相互复制的错误和不一致。
根据我自己的经验,在IE8中修复Prototype.js,我知道如果我们不首先嗅探,可以避免90%的问题。
在修复Prototype.js时,我发现需要测试的一些功能实际上在JS库中很常见,所以我为那些愿意摆脱嗅探的人制作了一些common feature tests的集合。 / p>
答案 2 :(得分:5)
理想的解决方案是将功能和浏览器检测结合起来。前者由于你提到的点和后者而失败,因为有时浏览器会发布虚假信息以“让事情变得有效”。
Mozilla有一个很棒的Browser Detection Primer也可能对您有所帮助。
来自wikipedia “在其历史的不同阶段,网络的使用一直由一个浏览器主导,以至于许多网站只能用于特定的浏览器,而不是根据W3C和IETF等机构的标准。通常包括“浏览器嗅探”代码,它根据收到的用户代理字符串改变发送的信息。这可能意味着不太流行的浏览器不会发送复杂的内容,即使他们可能能够正确处理它,或者极端情况拒绝了所有内容。因此,各种浏览器“隐藏”或“欺骗”此字符串,以便将自己标识为此类检测代码的其他内容;通常,浏览器的真实身份随后会包含在字符串中。“