JavaScript objects unique to all versions of Google Chrome?
我想知道是否有任何 javascript 对象是所有版本的 Google Chrome 独有的。
我知道有 window.chrome,但它只在 Chrome 15 中实现,这是相当新的。我想知道是否有任何对象(或多个对象结合在一起)只有 Google Chrome 才有。
我正在构建一个需要 Chrome 的网络应用程序的原因是因为它是以"Chrome/Google"为主题/基于的。我不希望使用 Firefox 或 IE 的用户查看看起来像 Google Chrome 的应用程序,并且(因为我有时自己这样做),我不想嗅探用户代理,因为它可能被欺骗。
任何帮助将不胜感激!
- 您是否真的担心向非 Chrome 用户展示 Chrome 主题的应用程序,这些用户足够精通更改浏览器的 UA 字符串?您项目的目标是增加 Chrome 浏览器的使用率吗? (也就是说,如果我访问您的网站并非常想查看它,但我没有 Chrome,那么您有权强制我下载 Chrome 吗?)如果我使用 Chromium 的 fork 和相同的渲染/JS 功能,但 UI 苦行者大不相同?
-
祝你好运。我完全同意 apsillers - 我每天使用 4 种不同的浏览器.. 不要打破特定的普遍性。
-
@apsillers 如果一个人足够精明地欺骗他们的用户代理,那么我不应该担心,但是,我不会试图以任何方式说服用户下载 Chrome,(但是,如果每个人都真的喜欢 Chrome会很可爱),而且就个人而言,50% 的时间我更喜欢 Firefox。通常,我讨厌浏览器歧视,如果我对此问题有疑问,我会使用 shims 和 Modernizr。但是这一次,它是纯实验性的(目前),我刚刚学习了 javascript 的基础知识。
-
@ModernDesigner:然后对该实验使用特征检测。
-
@Bergi 通常,是的,我会,但是因为我的应用程序不依赖于最新最好的 HTML5 和 CSS3 功能,所以我(个人)希望我的 Chrome 主题应用程序能够在 Google Chrome 中查看。 (并不是说它不使用 HTML5 和 CSS3,但这不是核心依赖)。看,如果最近你们真的不喜欢物体检测,那我就不会做。但我还是很好奇。
-
问题只是您尝试进行浏览器检测,而浏览器检测存在根本缺陷。在最基本的层面上,你有关于身份的哲学问题:如果我创建了一个 Chromium 的分支,它的行为就像 Chrome 一样(但有,比如说,一个自定义 UI 或其他一些微不足道的变化),你想允许那个浏览器吗?说"不"有点疯狂——该网站可以在这个几乎是 Chrome 浏览器中完美运行。现在假设我制作了一个更加不同的 Chromium 分支,或者我在 Firefox 源代码上进行了破解以使其像 Chrome 一样工作——你允许那些浏览器吗?
-
[con\\'t] 您的解决方案是"如果浏览器支持某些特定的 Chrome 特定对象\\,我们将调用浏览器 \\'Chome-ish enough\\'"。这种做法(即浏览器检测)只是一种笨拙的特征检测,您可以在其中测试与应用程序的操作完全无关的特征(如 UA 字符串或某些特定于浏览器的对象)。你认为这些不相关的特征意味着其他重要特征的存在,但除非你真正测试那些重要特征,否则你无法知道这一点。如果你直接测试特征,那么,瞧:你正在做特征检测。
使用特征检测来测试chome的正确方法如下:
1
| var isChrome = !(Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0) && 'WebkitTransform' in document.documentElement.style; |
查询的第二部分是检查您是否是 webkit,因为所有 webkit 浏览器的 CSS vendor属性都以 Webkit(大写 W)开头。
第二部分检查你是否是 safari 并否定第二部分。 Safari 是唯一带有"构造函数"的浏览器。
-
惊人的!谢谢!我知道 Safari 检测,但我从未想过要测试 Webkit,然后确保它不是 Safari。再次感谢。
-
我发布了我一直用来为 ie 做这件事的代码。它现在是开源的,称为 Defunctr。它骑在 Modernizr 上。 nuget.org/packages/Defunctr github.com/victoriafrench/defunctr
你为什么不检查浏览器是不是这样的Chrome?
1
| var isChrome = /chrome/.test(navigator.userAgent.toLowerCase()); |
(此处为原始答案)
- 我编辑了我的问题说"...,并且(因为我有时自己这样做),我不想嗅探用户代理,因为它很容易被欺骗。"
-
@ModernDesigner:不能欺骗属性?
-
@thesystem 这是一个公平的观点,但如果不重新编译浏览器,可能无法欺骗某些主机对象的行为(例如,在 delete 之后持续存在)。
-
@thesystem好吧,在那种情况下,我会完全同意apsillers和他之前所说的:如果用户精通技术,可以实际做类似的事情,我不应该担心这一点。但我仍然认为,UA-spoofing 对于普通人来说实际上要容易得多。
-
@apsillers:今天使属性不可配置(非deleteable)很容易。
-
@ModernDesigner:可能是。
-
@Bergi Fair point,这是一个不好的例子,但我认为我关于主机对象的更大观点仍然存在(尽管我也不是 100% 的。)
-
@apsillers:是的,我认为需要 V8 的怪癖才能真正可靠(或者更接近它)。有一个 V8 错误,其中不可枚举属性在原型链中隐藏可枚举属性时变为可枚举。这是基于该错误的浏览器测试。不知道它已经存在了多久,但已经有一段时间了。也许从一开始。