使用 Javascript 检测 Google Chrome 的安全基于功能的方法?
-
09-06-2019 - |
题
正如标题所述,我有兴趣找到一种安全的基于功能(即不使用 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
我经常使用行为/能力检测。在解决该问题之前直接检查浏览器是否支持该功能,而不是根据浏览器的名称(用户代理)来解决该问题。
特定于浏览器的解决方法的一个问题是,您不知道错误是否已修复或者现在是否支持该功能。当你进行能力检测时,你 知道 浏览器直接支持或不支持它,并且您不仅仅是浏览器主义者。
您不应该专门检测 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'),