使用用户代理字段进行浏览器检测

249 阅读4分钟

为不同浏览器提供不同的网页或服务通常是一个坏主意。互联网的本意是让任何人都可以访问,无论他们使用哪个浏览器或设备。有一些方法可以根据功能的可用性而不是针对特定的浏览器来开发您的网站以逐步增强自身。

但浏览器和标准并不完美,仍然需要检测浏览器的一些边缘情况。使用用户代理检测浏览器看起来很简单,但是做得很好,实际上是一个非常困难的问题。本文档将指导您尽可能正确地进行此操作。

值得重申的是:使用用户代理嗅探很少会成为一个好主意。你几乎总能发现一个更好的、更广泛兼容的方式来解决你的问题。

在使用浏览器检测之前需要考虑的一些事情

 当你考虑使用用户代理字段来检测用户正在使用哪种浏览器的时候,第一步是试着回避它。从想明白你为什么要这样做开始。

  • 你正尝试解决某个浏览器的某个版本中的一个特定错误吗?

    在专业论坛中查找、询问:你不太可能是第一个遇到这个问题的人。 你也可以询问专家,或者仅仅是那些和你持有不同观点的人们,他们能提供给你不同的思路。如果这个问题看上去是不常见的,你需要检查一下是否这个错误已经通过错误跟踪系统(Mozilla; WebKit; Opera)报告给浏览器厂商。浏览器开发商非常关注错误报告,相关的分析也可能会有其他解决方案的提示。

  • 你正尝试检查某个特性是否可用吗?

    你的站点需要使用一个特定的网页特性,然而有一些浏览器还不支持该特性,你想发给那些使用不支持该特性的浏览器的用户一个更老的网页,该网页有更少的特性,但是你知道他们将正常显示。这是最糟糕的使用用户代理检测的理由,因为有很大的概率最终其余的所有浏览器都将使用这个特性。你应该尽你最大努力在这种可能情况下阻止使用用户代理嗅探器,作为替代,使用功能检测器。

  • 你想依据正在使用的是哪个浏览器来提供不同的HTML页面吗?

    这通常是一个坏的做法,不过有些情况下这又是必要的。在这些情形下,你首先应该分析你所处的情形并确定这确实是必要的。你是否可以通过添加一些无语义的 ](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/div) 或者 [ 元素来避免呢?想成功使用用户代理检测是困难的,值得牺牲一些HTML的整洁性来换取。另外,也请重新思考一下你的设计:能否通过使用渐进增强或者流体布局来去除使用用户代理检测的需要呢?

避免进行用户代理检测

 如果你想要尝试避免使用用户代理检测,在某些情形下有些可供选择的方法。

  • 功能检测

    使用功能检测,你不需要弄清楚是哪种浏览器正在渲染你的页面,你只需要检测你需要的某个特定功能是否可用即可。如果该功能不可用,使用一个应变策略。然而,在某些罕见的情形下,你确实需要检测浏览器种类,由于其他浏览器也会在将来以不同方式实现这个功能,绝不要使用功能检测来判断。由此造成的错误将非常难发现和修复。

  • 渐进增强

    这种设计技术涉及了按照“层次”开发网页,使用自底向上的方法,从一个简单的层次开始,在一系列连续的层次中通过使用更多的功能来逐步提升站点的能力。

  • 优雅降级

    这是一种自顶向下的方式,在搭建可能最好的的站点时使用所有你想要的功能,然后稍微改进使其能在更老版本的浏览器上工作。与渐进增强的方法相比,这种方法可能更困难、效率更低,不过在一些情景下也许是有效的。

    MDN