浏览器检测与功能检测

浏览器检测与功能检测

问题描述:

我打算扮演一个魔鬼的拥护者。我一直在想,为什么浏览器检测(而不是特征检测)被认为是一种糟糕的做法。如果我测试某个特定版本的浏览器并确认,某些功能的行为是以某种可预测的方式进行的,那么决定做特殊情况似乎可以。理由是它将在未来万无一失,因为这部分浏览器版本不会改变。在另一方面,如果我发现一个DOM元素具有的功能X,它并不一定意味着:浏览器检测与功能检测

  1. 此功能适用于所有的浏览器同样的方式,并
  2. 更为关键的是,它会工作即使在所有未来的浏览器中也是如此。

我只是窥探了jQuery源代码,他们通过将精心构造的HTML代码片段插入到DOM中进行特征检测,然后检查它是否具有某些功能。这是一个明智而稳固的方式,但是我想说如果我在我的一小段个人JavaScript(没有jQuery)中做了这样的事情,那将会有点沉重。他们还具有实际无限的质量保证资源的优势。另一方面,你经常看到人们做的事情是他们检查函数X的存在,然后基于此,他们认为函数将在具有此函数的所有浏览器中以某种方式表现。

我不是说在这个意义上任何特征检测是不是一件好事(如果正确使用),但我不知道为什么浏览器检测通常会立即辞退,即使它听起来合乎逻辑。我想知道这是否是另一种流行的说法。

在我看来,自从几年前Resig发布this post以来,浏览器检测已被广泛地忽视。然而,Resig的评论是特定于库/框架代码的,即代码被其他[域特定]应用程序/站点消耗

我认为功能检测毫无疑问是适合库/框架的。但对于域特定的应用程序,我并不确定浏览器检测是否有问题。它适用于处理难以识别的已知浏览器特性,或者在实现特性本身时存在缺陷的浏览器。浏览器检测合适的时间:

  • 非跨浏览器且需要显示警告/对话框/ DifferentPage剪裁到该客户端浏览器的站点/应用程序。这在传统应用程序中很常见。
  • 银行或有关支持哪些浏览器和版本(以避免可能危及用户的数据已知的安全漏洞)
  • 微优化严格的政策,民营网站:偶尔一个浏览器是可笑的比别人快执行某些操作的时候某种方式。取决于您的用户群在特定的浏览器/版本上进行分支可能是有利的。
  • 在IE6中缺少png透明度
  • 许多显示/渲染问题(阅读:IE css支持)仅在特定浏览器版本中见过,而您实际上并不知道要测试哪些功能。

这就是说,有一些major pitfalls(可能是我们大多数人的承诺),以避免做浏览器检测时。

+0

“*在我看来,自从几年前Resig发布此帖以来,浏览器检测已被广泛地忽视*”。浏览器检测早在那篇文章之前就已经不是很好的做法我不认为你使用浏览器检测堆叠的任何原因。在哪个Intranet应用程序中缺乏对PNG透明度的支持?现在比以往任何时候都更简单地编写跨浏览器网站,只要采用实用的方法来实现更新的功能即可。你真的会放弃对浏览器的支持,因为它不支持* const *或* let *? – RobG 2017-01-31 00:00:17

+0

@RobG:我从来没有说过,“浏览器检测”等于“拒绝访问”和“放弃支持”。通过浏览器检测,我只是指在代码中存在“if(navigator.userAgent ...)”。如果检测到某个浏览器会发生什么变化。它可能仅仅意味着使用gif而不是png。 – 2017-01-31 16:23:09

理想的解决方案是具有两个特征和浏览器检测的组合。前者因为你提到的点和后者而下降,因为有时候浏览器发布虚假信息以“让事情变得有效”。

Mozilla有一个伟大的Browser Detection Primer,可能会对你有所帮助为好。

wikipedia “在其历史上的各个点,利用网络的一直由一个浏览器,很多网站都设计成只与特定的浏览器上运行,而不是根据来自机构,如标准的程度W3C和IETF,这些网站通常包含“浏览器嗅探”代码,这些代码根据收到的用户代理字符串改变发送的信息,这可能意味着不太流行的浏览器不会发送复杂的内容,即使它们能够正确处理它,或者在极端情况下拒绝所有内容,因此各种浏览器会“欺骗”或“欺骗”这个字符串,以便将自己标识为此类检测代码的其他内容;通常,浏览器的真实身份随后会被包含串“。

Here's a good article解释功能检测是如何在这么多的方式浏览器嗅探优越。

事实是,嗅探是非常脆弱的。理论上它很脆弱,因为它依赖于任意任意userAgent字符串,然后将字符串实际映射到特定行为。随着时间的推移,它在实践中也很脆弱。测试几十种浏览器的每个主要版本和次要版本,并尝试解析其中一些版本的内部版本号是不现实的;另一方面,测试怪癖的某些行为更加健壮。例如,功能测试通常可以发现浏览器供应商偶然拷贝的错误和不一致之处。

从我自己的经验,固定原型。js在IE8中,我知道如果我们一开始没有嗅到,就可以避免90%的问题。

在修复Prototype.js时,我发现需要测试的一些功能在JS库中非常普遍,所以我为任何愿意摆脱嗅探的人做了一些小小的集合common feature tests