正如标题所述,我有兴趣找到一种安全的基于功能(即不使用 navigator.appName 或 navigator.appVersion)的方法来检测 Google Chrome。

基于特征我的意思是,例如:

if(window.ActiveXObject) {
    // internet explorer!
}

编辑: 正如已经指出的那样,这个问题没有多大意义(显然,如果你想实现一个功能,你可以测试它,如果你想检测特定的浏览器,你可以检查用户代理),抱歉,现在是凌晨 5 点;) 让我这样表述:是否有任何 Chrome 独有的 javascript 对象和/或功能...

有帮助吗?

解决方案

isChrome = function() {
    return Boolean(window.chrome);
}

其他提示

这个答案已经非常过时了, ,但这在石器时代非常相关。

我认为功能检测比 navigator.userAgent 解析更有用,因为我在 google 上搜索了 Opera ambiguosity 这里. 。没有人知道 IE16 是否会解析 /MSIE 16.0;/ regexp - 但我们可以非常确定,将会有 document.all 支持。在现实生活中,这些功能通常是浏览器的同义词,例如: “没有 XMLHttpRequest?这是该死的 IE6!”没有非IE浏览器支持document.all,但某些浏览器(例如Maxthon)可以扰乱userAgent。(当然,出于某种原因,脚本可以在Firefox中定义document.all,但它很容易控制。)因此我建议这个解决方案。

编辑 这里 我找到了完整的资源。

编辑2 我测试过,document.all也被Opera支持!

var is = {
  ff: window.globalStorage,
  ie: document.all && !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStyle && !window.globalStorage && !window.opera
}

使用很简单:

if(is.ie6) { ... }

不完全是问题的答案...但如果您试图检测特定的浏览器品牌,那么功能检查的意义就有点丢失了。我非常怀疑任何其他浏览器正在使用 Chrome userAgent 字符串,因此如果您的问题是“这个浏览器是 Chrome”,您应该看看它。(顺便说一下,window.ActiveXObject不保证IE,其他浏览器有插件提供这个对象。这说明了我想要表达的观点。)

对于纳粹的所有标准...有时你可能想使用流血的“标准技术”,这些技术还不是标准的,但它们将会......比如css3的特性。

这就是我找到此页面的原因。

由于某种原因,Safari 可以很好地运行 border-radius 和 box-shadow 的组合,但 chrome 无法正确渲染该组合。因此,即使是 webkit 禁用该组合,找到一种检测 chrome 的方法也是很好的。

我遇到了数百个理由来检测特定的浏览器/版本,通常最终会放弃一个很酷的功能的想法,因为我想做的事情不受大邪恶的支持......

但有时,某些功能太酷了,以至于无法不使用它们,即使它们尚未标准化。

所以,如果你接受 Marijn 的观点并且 有兴趣通过 javascript 测试用户代理字符串:

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

(归功于: http://davidwalsh.name/detecting-google-chrome-javascript )


这是 chrome 用户代理字符串的非常好的分析/细分: http://www.simonwhatley.co.uk/whats-in-google-chromes-user-agent-string

我经常使用行为/能力检测。在解决该问题之前直接检查浏览器是否支持该功能,而不是根据浏览器的名称(用户代理)来解决该问题。

特定于浏览器的解决方法的一个问题是,您不知道错误是否已修复或者现在是否支持该功能。当你进行能力检测时,你 知道 浏览器直接支持或不支持它,并且您不仅仅是浏览器主义者。

http://diveintohtml5.ep.io/everything.html

您不应该专门检测 Chrome。如果有的话,您应该检测 WebKit,因为就页面渲染而言,Chrome 的行为应该与其他 WebKit 浏览器(Safari、Epiphany)完全相同。

如果您不仅需要检测 WebKit,还需要准确找出正在使用的版本,请参阅此链接: http://trac.webkit.org/wiki/DetectingWebKit

但同样,正如其他人上面所说,您不应该检测浏览器,您应该检测功能。有关详细信息,请参阅这篇 ADC 文章: http://developer.apple.com/internet/webcontent/objectdetection.html

您可能需要知道 Chrome 浏览器的原因之一是因为它“非常”符合标准。我已经遇到了旧 JavaScript 代码的问题,我认为这些代码符合标准(按照 FF 或 Opera 标准 - 非常好),但 Chrome 更加挑剔。它迫使我重写一些代码,但有时使用 if(isChrome) { blah...blah ) 技巧来让它运行可能更容易。Chrome 似乎运行得很好(我支持标准合规性),但有时您只需要详细了解用户正在运行的内容。

而且,Chrome 速度非常快。问题是,一些 JavaScript 代码无意中依赖于其他浏览器的缓慢运行速度,即:页面加载、iframe 加载、样式表链接的放置和页面头部的 javascript 链接等。当函数真正可用于与页面元素交互时,这些可能会导致新的问题。所以现在,你可能真的需要知道......

我使用此代码为每个浏览器制作书签(或为 webkit 显示一条消息)

if (window.sidebar) { 
// Mozilla Firefox Bookmark
window.sidebar.addPanel(title, url,"");
} else if( window.external ) { // IE Favorite
  if(window.ActiveXObject) {
  //ie
  window.external.AddFavorite( url, title);
  } else {
  //chrome
  alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok');
  }
} else if(window.opera && window.print) { 
// Opera
  return true; }
 else { //safri
 alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok'); }

由于 Opera 也有可能存在误报 window.chrome 目的。作为一个很好的解决方案,我使用;

var isOpera = !!window.opera || !!window.opr;// Opera 8.0+

var isChrome = !!window.chrome && !isOpera;

这个解决方案几乎总是有效的。然而我发现的一件事是, isChrome 回报 false 在 iPad Chrome 版本 52.0 中为 window.chrome 回报 false.

是IE:!!(!window.addEventListener && window.ActiveXObject),

是IE6:typeof document.createElement('DIV').style.maxHeight == "未定义",

是IE7:!!(!window.addEventListener && window.XMLHttpRequest && !document.querySelectorAll),

是IE8:!!(!window.addEventListener && document.querySelectorAll && document.documentMode == 8),

是壁虎:navigator.product == '壁虎',

是歌剧:!!窗户.歌剧,

是铬:!!window.chrome,

是Webkit:!!(!window.opera && !navigator.taintEnable && document.evaluate && navigator.product != 'Gecko'),

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top