- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道使用 userAgent
属性检测浏览器是一个糟糕的主意,因为浏览器会骗你,因为同一浏览器的不同版本可能具有不同的功能集,而 的值相同用户代理
。功能检测绝对是真正确定您想要做的事情在浏览器中是否可行的方法。
我希望弄清楚的是,是否可以使用特征检测来弄清楚浏览器到底是什么。也就是说,识别用户代理具有的特定怪癖,然后确定哪个浏览器具有这些完全相同的怪癖。例如,如果浏览器没有定义 XMLHttpRequest
但定义了 ActiveXObject
那么我们就知道它将是 MSIE 6 或更低版本。
是否有此类识别怪癖的库或它们的列表以便我可以自己编写?
编辑:我并没有真正提供这背后的理由。我想升级一个收集网络应用程序使用统计信息的系统。它需要我弄清楚浏览器并且当前使用userAgent
。我正在寻找更强大的东西。
最佳答案
既然您已经阐明了您真正要查找的内容(记录用于统计收集的实际浏览器类型,而不是网页编程),似乎所有浏览器的默认开箱即用行为都包含一个非欺骗性和唯一标识用户代理。因此,对于第一数量级,您应该确保您了解如何正确解释所有这些,因为这可能是您遇到的 99%。 Google 显示了一堆不同的用户代理列表。我喜欢 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 等...以获得其他想法。
关于internet-explorer - 通过对象/特征检测进行浏览器检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528457/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!