javascript-浏览器检测与功能检测

我将扮演一个恶魔的拥护者片刻。 我一直想知道为什么将浏览器检测(而不是功能检测)视为一种不好的做法。 如果我测试某个浏览器的某个版本并确认该功能以某种可预测的方式运行,则可以决定对其进行特殊处理。 理由是将来会很安全,因为此部分浏览器版本不会更改。 另一方面,如果我检测到DOM元素具有函数X,则不一定表示:

  1. 此功能在所有浏览器中的工作方式相同,并且
  2. 更重要的是,即使在将来的所有浏览器中,它也将以相同的方式工作。

我只是窥视了jQuery源,他们通过将精心构建的HTML代码段插入DOM中来进行功能检测,然后他们检查它是否具有某些功能。 这是一种明智而可靠的方式,但是我要说的是,如果我只是在自己的小块JavaScript(没有jQuery)中做类似的事情,那将会太繁重。 它们还具有几乎无限的质量检查资源的优势。 另一方面,您经常看到人们在做什么,他们检查功能X的存在,然后基于此,他们假定该功能在所有具有此功能的浏览器中将以某种方式运行。

我并不是说功能检测不是一件好事(如果使用正确),但是我想知道为什么浏览器检测通常听起来很合逻辑,但通常会立即被取消。 我不知道这是否是另一种时髦的说法。

Jan Zich asked 2020-07-31T21:36:31Z
3个解决方案
26 votes

在我看来,自几年前Resig撰写此帖子以来,浏览器检测一直被广泛接受。 但是,Resig的注释特定于库/框架代码,即其他[特定于域的]应用程序/站点将使用的代码。

我认为毫无疑问,特征检测非常适合于库/框架。 但是,对于特定于域的应用程序,我不确定浏览器检测是否很糟糕。 它适用于解决难以进行功能检测的已知浏览器特征,或者适用于在实现功能本身中存在错误的浏览器。 浏览器检测适当的时间:

  • 不是跨浏览器的站点/应用程序,需要显示针对该客户端浏览器的警告/对话框/ DifferentPage。 这在旧版应用程序中很常见。
  • 对支持哪些浏览器和版本具有严格策略的银行或私人站点(以避免已知的安全漏洞可能危害用户数据)
  • 微观优化:以某种方式执行某些操作时,有时一个浏览器的速度要比其他浏览器快得多。 根据您的用户群在该特定浏览器/版本上进行分支可能是有利的。
  • IE6中缺乏png透明度
  • 许多显示/渲染问题(请参阅:IE css支持)仅在特定的浏览器版本中可见,而您实际上并不知道要测试什么功能。

也就是说,在进行浏览器检测时要避免一些主要的陷阱(可能是我们大多数人犯下的)。

Crescent Fresh answered 2020-07-31T21:48:28Z
23 votes

这是一篇很好的文章,解释了特征检测在许多方面对浏览器嗅探的优越性。

事实是,嗅探极其脆弱。 它在理论上是脆弱的,因为它依赖于任意的userAgent字符串,然后实际上将该字符串映射为某种行为。 时间证明,它在实践中也很脆弱。 测试数十种浏览器的每个主要版本和次要版本,并试图解析其中一些版本的内部版本号根本不切实际。 另一方面,针对怪癖测试某些行为则更加健壮。 例如,功能测试通常会捕获浏览器供应商之间相互抄袭的错误和不一致之处。

根据我自己的经验,在IE8中修复Prototype.js,我知道,如果我们不首先嗅探,就可以避免90%的问题。

修复Prototype.js时,我发现一些需要测试的功能实际上在JS库中很常见,因此我为那些愿意摆脱嗅探的人收集了一些通用功能测试。

kangax answered 2020-07-31T21:49:02Z
5 votes

理想的解决方案是将功能和浏览器检测结合起来。 前者由于您提到的要点而倒下,而后者则是因为有时浏览器会发布虚假信息来“使事情正常”。

Mozilla has a great Browser Detection Primer that might be helpful to you as well.

来自维基百科“在其历史的各个阶段,Web的使用一直受一种浏览器的支配,其程度是许多网站被设计为只能与该特定的浏览器一起使用,而不是按照W3C和IETF等机构的标准进行。此类网站 通常会包含“浏览器嗅探”代码,该代码会根据收到的User-Agent字符串来更改发送的信息,这可能意味着不太流行的浏览器不会发送复杂的内容,即使它们可能能够正确处理它,也可能会 极端情况会拒绝所有内容。因此,各种浏览器“伪装”或“欺骗”此字符串,以便将自己标识为此类检测代码的其他内容;通常,随后在字符串中包含浏览器的真实身份。”

Joshua answered 2020-07-31T21:50:28Z
translate from https://stackoverflow.com:/questions/1294586/browser-detection-versus-feature-detection