javascript - 浏览器检测与特征检测

标签 javascript html dom cross-browser

我暂时要扮演一个魔鬼的拥护者。我一直想知道为什么浏览器检测(而不是功能检测)被认为是一种糟糕的做法。如果我测试了某个浏览器的某个版本并确认,某些功能的行为是在某种可预测的方式下,那么决定做特殊情况似乎是可以的。原因是将来会万无一失,因为这个部分浏览器版本不会改变。另一方面,如果我检测到 DOM 元素具有函数 X,则不一定意味着:

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

我刚刚浏览了 jQuery 源代码,他们通过将精心构建的 HTML 片段插入 DOM 来进行特征检测,然后他们检查它的某些特征。这是一种明智而可靠的方式,但我会说,如果我只是在我的一小段个人 JavaScript(没有 jQuery)中做这样的事情,它会有点太重了。他们还拥有几乎无限的 QA 资源的优势。另一方面,你经常看到人们做的是检查函数 X 是否存在,然后基于此,他们假设该函数在所有具有此函数的浏览器中都会以某种方式运行。

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

最佳答案

在我看来,自 this post 以来,浏览器检测一直受到广泛反对。几年前由 Resig 撰写。然而,Resig 的评论是针对库/框架代码的,即将被其他[领域特定]应用程序/站点使用的代码。

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

  • 不跨浏览器且需要显示针对该客户浏览器定制的警告/对话框/DifferentPage 的站点/应用程序。这在遗留应用程序中很常见。
  • 对支持的浏览器和版本有严格政策的银行或私有(private)网站(以避免可能危及用户数据的已知安全漏洞)
  • 微优化:有时一个浏览器在以某种方式执行某些操作时比其他浏览器快得离谱。根据您的用户群,在特定浏览器/版本上分支可能是有利的。
  • 在 IE6 中缺乏 png 透明度
  • 许多显示/呈现问题(阅读:IE css 支持)仅在特定浏览器版本中出现,您实际上不知道要测试什么功能。

也就是说,有一些 major pitfalls (可能我们大多数人都会这样做)在进行浏览器检测时避免。

关于javascript - 浏览器检测与特征检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294586/

相关文章:

javascript - 从 Jquery 发送到 PHP 时 JSON 格式错误

javascript - Kendo Core - 需要基本帮助

javascript - 所有 IE 上的 Html5 占位符问题

html - CSS infline-flex : text overlap

javascript - 如何读取从 Controller 作为排序列表返回的 JavaScript 对象的值

javascript - 是否可以使用 JavaScript 转储 DOM 并保留 CSS 效果和布局?

javascript - window.requestFileSystem() 函数的简单示例

javascript - 某些页面上的 ga ("send"、 "pageview") 中的 Google Analytics 错误

jQuery .width() 有时有效;有时不是吗?

html - 在空间之间跨度元素不流入?