通过对象/特征检测进行浏览器检测

时间:2011-06-29 23:33:57

标签: internet-explorer browser javascript

我知道使用userAgent属性进行浏览器检测是一个糟糕的主意,因为浏览器会骗你,因为同一浏览器的不同版本可能具有不同的功能集,而userAgent的值相同。功能检测绝对是实际确定您想要在浏览器中实现的功能的方法。

我希望弄清楚的是,是否可以使用特征检测来确定浏览器实际是什么。也就是说,识别用户代理具有的特定怪癖,然后确定哪个浏览器具有那些完全相同的怪癖。例如,如果浏览器没有定义XMLHttpRequest但定义ActiveXObject,那么我们就知道它将是MSIE 6或更低版本。

是否有一个这样的识别怪癖库或它们的列表,所以我可以自己编写?

编辑: 我并没有真正提供这背后的理由。我想升级一个收集Web应用程序使用情况统计信息的系统。它需要我找出浏览器并且当前使用userAgent。我正在寻找更强大的东西。

3 个答案:

答案 0 :(得分:2)

现在你已经明确了你真正想要的东西(记录统计收集的实际浏览器类型,而不是网页编程),似乎所有浏览器的默认开箱即用行为都包含非欺骗性和唯一识别用户代理。所以,对于第一个数量级,你应该确保你理解如何正确地解释所有这些,因为这可能是你遇到的99%。谷歌展示了一堆不同的用户代理列表。我喜欢this one的“浏览器”列。你可以很容易地在许多浏览器(Gecko,Webkit,MSIE,Presto)中识别渲染引擎和版本,然后从那里决定你关心的细节(例如它是Firefox还是Camino)。每个浏览器都是开箱即用的唯一标识。您可以根据需要编制尽可能详细的子浏览器标识。

然后,如果真的有必要尝试用虚假的用户代理来识别那些骗你的浏览器,我会感到很惊讶。如果您有50个不同浏览器的30个不同版本,那么通过功能检测来尝试唯一地识别每个浏览器是一项巨大的工作,而不依赖于用户代理。您必须构建一个庞大的测试数据库,并定期更新。并且,我不知道您是如何获得所有这些小修订版以了解如何为它们编码和/或测试它们。

如果您只是想确定哪些浏览器正在关注其渲染引擎(例如,当它们真的是MSIE时声称Gecko)那么这可能是一个更简单的问题,因为您可以通过少量的功能测试(例如您为IE6确定的那个)。但是,这仍然是一项艰巨的任务。如果我这样做,我会从IE支持的一组专有内容开始,每个主要版本并测试这些内容。通常可以肯定地说,没有其他人支持大多数不具备标准的IE特定事物。然后,我可能会在Gecko渲染引擎中寻找一些特定于mozilla的东西。现在,每个引擎都有自己的特定于CSS3的标签-moz,-o,-ms,-webkit,这些标签几乎可以指示渲染引擎(对于更高版本)。当这些标准最终确定时,这些将最终消失,但大多数浏览器将长期保持与其变体的向后兼容性(微软,可能永远)。

您可以研究一些使用重度特征检测的跨浏览器库,如Modernizer,YUI,jQuery等,以用于其他想法。

答案 1 :(得分:1)

Modernizr是一个很好的图书馆,结合YepNope,您将获得使所有(最好)浏览器都能正常运行的网站所需的一切。

答案 2 :(得分:1)

这是课程的马匹问题。浏览器通过UA字符串进行嗅探被认为是有缺陷的,因为它根据任意文本字符串识别浏览器对浏览器功能进行了假设。这是有缺陷的,不仅因为UA字符串是众所周知的不可靠,而且因为字符串的分析仅限于那些已知的浏览器。引入新的浏览器,甚至是已知浏览器的新版本,都需要更新浏览器嗅探程序的一部分。

另一方面,尝试从功能中确定浏览器的可靠性更低。您最终会尝试为每个浏览器定义一系列针对浏览器怪癖的测试。你将有一个永无止境的工作,试图找出哪些浏览器具有哪些功能而排除所有其他浏览器。

收集统计信息的网站使用user-agent header在服务器上执行此操作。当然它是不可靠的,但结果至少能够在合理的错误内进行分析,可以更容易地识别新的或未知的浏览器,并且您不依赖于客户端脚本。

有大量可用于分析的UA字符串数据库,例如: http://www.user-agents.org/。请注意,您将有一定的错误率,并且不要太依赖于统计数据(user-agent.org列出了带有“mozilla”的24个UA字符串,其中大多数不是浏览器,有174个MSIE in它们)。