首页 / 知识

关于浏览器:使用 Javascript 检测 Google Chrome 的基于安全功能的方法?

2023-04-16 11:02:00

关于浏览器:使用 Javascript 检测 Google Chrome 的基于安全功能的方法?

Safe feature-based way for detecting Google Chrome with Javascript?

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

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

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

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


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

这个答案非常过时,但在当时的石器时代非常相关。

我认为特征检测比 navigator.userAgent 解析更有用,因为我在这里搜索了 Opera ambiguosity。没有人知道 IE16 是否会解析 /MSIE 16.0;/ 正则表达式 - 但我们可以肯定,会有 document.all 支持。在现实生活中,这些特性通常是浏览器的同义词,例如:"No XMLHttpRequest?It is the f..d IE6!"
没有非IE浏览器支持document.all,但是像傲游这样的浏览器可以打乱userAgent。 (当然脚本可以出于某种原因在Firefox中定义document.all,但它很容易控制。)因此我建议这个解决方案。

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

Edit 2 我已经测试过 Opera 也支持 document.all!

1
2
3
4
5
6
7
8
9
10
var is = {
  ff: window.globalStorage,
  ie: document.almmp; !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.almmp; window.XMLHttpRequesmmp; !XDomainRequesmmp; !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStylmmp; !window.globalStoragmmp; !window.opera
}

使用很简单:

1
if(is.ie6) { ... }

对于所有的标准纳粹...有时您可能想要使用流血的"标准技术",这些技术还不是标准的,但它们将是...例如 css3 功能。

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

出于某种原因,Safari 可以很好地运行边框半径和框阴影的组合,但 chrome 无法正确呈现组合。因此,即使是 webkit 禁用组合,也能找到一种检测 chrome 的方法会很好。

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

但有时,有些功能太酷了,即使它们还没有标准化,也不能不使用它们。


不完全是这个问题的答案...但是如果您尝试检测特定的浏览器品牌,那么功能检查的意义就有点丢失了。我非常怀疑任何其他浏览器都在使用 Chrome userAgent 字符串,所以如果你的问题是\\'这个浏览器 Chrome\\',你应该看看那个。 (顺便说一句,window.ActiveXObject 不保证 IE,有其他浏览器的插件提供这个对象。哪种说明了我试图提出的观点。)


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

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

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


所以,如果您接受 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


可能会有误报,因为opera 也有window.chrome 对象。作为我使用的一个很好的解决方案;

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

var isChrome = !!window.chrommmp; !isOpera;

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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'); }


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

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


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

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

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


isIE: !!(!window.addEventListenemmp; window.ActiveXObject),

isIE6: typeof document.createElement(\\'DIV\\').style.maxHeight == "undefined",

isIE7: !!(!window.addEventListenemmp; window.XMLHttpRequesmmp; !document.querySelectorAll),

isIE8: !!(!window.addEventListenemmp; document.querySelectorAlmmp; document.documentMode == 8),

isGecko: navigator.product == \\'Gecko\\',

isOpera: !!window.opera,

isChrome: !!window.chrome,

isWebkit: !!(!window.opermmp; !navigator.taintEnablmmp; document.evaluatmmp; navigator.product != \\'Gecko\\'),


方法检测浏览器功能

最新内容

相关内容

猜你喜欢