代码之家  ›  专栏  ›  技术社区  ›  jeannicolas

使用Javascript检测谷歌Chrome浏览器的安全基于特征的方法?

  •  16
  • jeannicolas  · 技术社区  · 17 年前

    正如标题所述,我很想找到一种基于安全功能(即不使用navigator.appName或navigator.app.Version)的方法来检测谷歌Chrome浏览器。

    例如,我所说的基于特征是指:

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

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

    11 回复  |  直到 17 年前
        1
  •  32
  •   pcorcoran    17 年前
    isChrome = function() {
        return Boolean(window.chrome);
    }
    
        2
  •  9
  •   Jan Turoň    7 年前

    这个答案太过时了 ,但这在石器时代非常重要。

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

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

    编辑2 我已经测试了该文档。所有这些都得到了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) { ... }
    
        3
  •  4
  •   Marijn    17 年前

    这并不是问题的确切答案。..但如果你试图检测特定的浏览器品牌,功能检查的重点就有点丢失了。我非常怀疑任何其他浏览器都在使用Chrome userAgent字符串,所以如果你的问题是“这个浏览器是Chrome吗”,你应该看看这个。(顺便说一句,window.ActiveObject不保证IE,其他浏览器也有插件提供此对象。这说明了我试图表达的观点。)

        4
  •  4
  •   name name    16 年前

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

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

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

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

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

        5
  •  1
  •   micahwittman    17 年前

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

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

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


    下面是对chromes用户代理字符串的一个非常好的分析/分解: http://www.simonwhatley.co.uk/whats-in-google-chromes-user-agent-string

        6
  •  1
  •   DanBeale newtron    14 年前

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

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

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

        7
  •  0
  •   Pazu Pazu    17 年前

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

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

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

        8
  •  0
  •   Dwight Vietzke Dwight Vietzke    16 年前

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

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

        9
  •  0
  •   racy_rick racy_rick    16 年前

    我使用此代码为每个浏览器制作书签(或为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'); }
    
    
        10
  •  0
  •   Jesse Hosain Ahmed    7 年前

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

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

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

        11
  •  -1
  •   Kean    15 年前

    是的:!!(!window.addEventListener和window.ActiveXObject),

    isIE6:文档类型.createElement('DIV').style.maxHeight==“undefined”,

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

    是IE8:!!(!window.addEventListener&document.query Selector All&&document.documentMode==8),

    isGecko:navigator.product=='Gecko',

    isOpera:!!窗口操作,

    isChrome:!!windows.chrome,

    isWebkit:!!(!window.operate&navigator.aintEnable&document.evaluate&&navigator.product!=“壁虎”),