【问题标题】:How to detect chrome and safari browser (webkit)如何检测 chrome 和 safari 浏览器(webkit)
【发布时间】:2012-09-19 12:06:15
【问题描述】:

我正在尝试使用 jquery 或 javascript 检测 chrome 和 safari 浏览器。 我认为我们不应该使用 jQuery.browser。这里有什么建议吗?非常感谢!

【问题讨论】:

  • 你可以使用jQuery.browser,只是不推荐,因为用户代理可能被欺骗。相反,建议您使用不可欺骗的特征检测。
  • 为什么需要检测 Chrome 或 Safari?你想做什么?
  • 它如何使用特征检测?具有相同功能的两个浏览器会给出相同的结果!
  • @PeeHaa 你应该学习如何使用 Google 和 jQuery.browser:api.jquery.com/jQuery.browser。它使用用户代理,jQuery 推荐使用特征检测。 jQuery.browser 已弃用
  • @PeeHaa — 太好了。所以 Chrome 27 不支持 FOO,但 Safari 支持。因此,您根据包括对 FOO 的支持在内的各种因素来决定哪个是哪个。然后 Chrome 28 出来了,它确实支持 FOO,所以老 jQuery 认为 Chrome 28 是 Safari。 (这个例子说明了为什么特征检测比浏览器检测更好,以及为什么你不能使用特征检测来可靠地确定浏览器 - 保持最新是困难

标签: javascript jquery


【解决方案1】:

如果您不想使用$.browser,请查看case 1,否则也许case 23可以帮助您只是为了获得通知,因为不建议使用$.browser(用户代理可以使用它来欺骗)。另一种方法是使用jQuery.support,它将检测功能支持而不是代理信息。

但是……

如果您坚持使用浏览器类型(仅 Chrome 或 Safari),但不使用 $.browser案例 1 就是您要寻找的...


这符合您的要求:

案例 1: (没有 jQuery 也没有 $.browser,只有 javascript)

现场演示: http://jsfiddle.net/oscarj24/DJ349/

var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

if (isChrome) alert("You are using Chrome!");
if (isSafari) alert("You are using Safari!");

这些案例我以前用过,效果很好,但不推荐……

案例2: (使用jQuery和$.browser,这个比较棘手)

现场演示: http://jsfiddle.net/oscarj24/gNENk/

$(document).ready(function(){

    /* Get browser */
    $.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());

    /* Detect Chrome */
    if($.browser.chrome){
        /* Do something for Chrome at this point */
        /* Finally, if it is Chrome then jQuery thinks it's 
           Safari so we have to tell it isn't */
        $.browser.safari = false;
    }

    /* Detect Safari */
    if($.browser.safari){
        /* Do something for Safari */
    }

});

案例3: (使用jQuery和$.browser,“优雅”的解决方案)

现场演示: http://jsfiddle.net/oscarj24/uJuEU/

$.browser.chrome = $.browser.webkit && !!window.chrome;
$.browser.safari = $.browser.webkit && !window.chrome;

if ($.browser.chrome) alert("You are using Chrome!");
if ($.browser.safari) alert("You are using Safari!");

【讨论】:

  • @ 案例 3 不会误检测岩石熔体和铬吗?
  • 如何为 IE 和 FireFox 写出案例 1?
  • 您的演示在 Maxthon 下失败。它将它识别为 Safari,因为它是 webkit。
  • JQuery 不再支持 .Browser。现在已经贬值了。查看 vsync 的答案。
  • 喜欢.live(..) 和其他人。我还写了不建议使用它@MichaelMikhjian
【解决方案2】:

这里的大多数答案都已过时,没有更多的jQuery.browser,为什么有人甚至会使用 jQuery 或嗅探User Agent 超出了我的范围。

与其检测浏览器,不如检测一个功能
(无论是否支持)。

以下是Mozilla FirefoxMicrosoft Edge中的false;它是 Google Chrome 中的 true

"webkitLineBreak" in document.documentElement.style

请注意,这不是面向未来的。 浏览器可以在将来的任何时间实现-webkit-line-break 属性,从而导致错误检测。 然后,您可以在 Chrome 中查看文档对象并选择带有 webkit 前缀的任何内容,并检查其他浏览器中是否缺少该对象。

【讨论】:

  • 如果浏览器声称支持某项功能,但与其他浏览器的支持方式不同,这将不起作用。
  • 如果您需要更强的特征检测,那么混合多个测试就可以了。你需要选择一个你确定的特性,并且知道它在其他浏览器上的表现,而不是随机的。
  • 示例:HTML5“日期”输入类型。在 iOS WebKit 上,没有办法将字段留空;所以我必须手动添加一个“清除”按钮。 Safari 声称可以理解 Date,但它处理不正确。我想不出任何方法可以通过特征检测来判断谁做对了
  • @StephenR - 你说的不是特征检测,而是实现检测,这是另一个主题。
  • 我所说的是检测一个我知道的浏览器与其他浏览器的不同之处! ;-)
【解决方案3】:

与其检测浏览器,不如检测一项功能(无论它是否受支持)。这就是Modernizr 所做的。

当然,在某些情况下,您仍然需要检查浏览器,因为您需要解决问题而不是检测功能。具体WebKit检查哪个不使用jQuery $.browser

var isWebKit = !!window.webkitURL;

正如一些 cmets 所建议的,上述方法不适用于旧 Safari 版本。使用 cmets 中建议的另一种方法和另一个答案进行更新:

var isWebKit = 'WebkitAppearance' in document.documentElement.style;

【讨论】:

  • 虽然您说这是最好的做法是对的,但并非总是可行。例如,webkit 浏览器包含一个我希望解决的错误,我无法轻松检查。我几乎无法检查用户代理。
  • 你的检查很好,但可能不是未来的证明,因为最终 webkitURL 将被 URL 替换。
  • window.webkitURL 不受旧版本的 safari(6.0 之前)和 chrome(8.0 之前)的支持
  • 这个答案不正确。 Modernizr 不会告诉您浏览器特定的错误,而且兼容性不仅仅是功能检测。当您想要检测功能时使用功能检测,当您想要修复特定于浏览器的故障时使用浏览器检测。
  • WebkitAppearance 对我不起作用。 Firefox 也被检测到。 MDN 解释 ff 并且出于兼容原因支持它 developer.mozilla.org/en-US/docs/Web/CSS/appearance
【解决方案4】:

2019 年仍然存在怪癖和不一致。

例如,浏览器之间的缩放 svg 和指针事件。

这个主题的答案都不再有效。 (也许那些带有 jquery 的人)

这是一个替代方法,通过原生CSS support api 使用javascript 测试是否支持css 规则。可能会进化,需要适应!

请注意,可以传递许多用分号分隔的 css 规则,以便进行最佳检测。

if (CSS.supports("( -webkit-box-reflect:unset )")){
  console.log("WEBKIT BROWSER")
  // More math...
 } else {
  console.log("ENJOY")
 }

if (CSS.supports("( -moz-user-select:unset )")){
  console.log("FIREFOX!!!")
 }

注意不要在循环中使用它,为了提高性能,最好在负载时填充一个常量:

const ff = CSS.supports("( -moz-user-select:unset )")
if (ff){ //... } 

使用 CSS only,上面将是:

@supports (-webkit-box-reflect:unset) {
  div {
    background: red
  }
}

@supports (-moz-user-select:unset) {
  div {
    background: green
  }
}
<div>
  Hello world!!
</div>

List of possible -webkit- only css rules.

List of possible -moz- only rules.

Can I use css support?

【讨论】:

    【解决方案5】:

    /WebKit/.test(navigator.userAgent)——就是这样。

    【讨论】:

    • 不幸的是,新的 MS 浏览器 Edge 位于 UserAgent:“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 " 并且此行为得到官方确认here
    • window.webkitURL 和 'WebkitAppearance' 等大多数解决方案也不会排除 Edge。
    • 你可以通过(/WebKit/.test(navigator.userAgent) &amp;&amp; !/Edge/.test(navigator.userAgent))过滤掉边缘
    【解决方案6】:

    我正在尝试使用 jquery 或 javascript 检测 chrome 和 safari 浏览器。

    使用jQuery.browser

    我认为我们不应该使用 jQuery.browser。

    那是因为检测浏览器是个坏主意。如果您真的打算这样做,它仍然是检测浏览器(当涉及 jQuery 时)的最佳方法。

    【讨论】:

      【解决方案7】:

      您可以使用这个缩小的 jQuery sn-p 来检测您的用户是否正在使用移动设备查看。如果您需要测试特定设备,我在下面包含了一组 JavaScript sn-ps,可用于检测各种移动手持设备,例如 iPad、iPhone、iPod、iDevice、Andriod、Blackberry、WebOs 和 Windows Phone。

      /**
       * jQuery.browser.mobile (http://detectmobilebrowser.com/)
       * jQuery.browser.mobile will be true if the browser is a mobile device
       **/
      
          (function(a){jQuery.browser.mobile=/android.+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)/|plucker|pocket|psp|symbian|treo|up.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|/(k|l|u)|50|54|e-|e/|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(-|2|g)|yas-|your|zeto|zte-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);
      

      示例用法:

      if(jQuery.browser.mobile)
      {
      console.log(‘You are using a mobile device!’);
      }
      else
      {
      console.log(‘You are not using a mobile device!’);
      }
      

      检测 iPad

      var isiPad = /ipad/i.test(navigator.userAgent.toLowerCase());
      if (isiPad)
      {
      …
      }
      

      检测 iPhone

      var isiPhone = /iphone/i.test(navigator.userAgent.toLowerCase());
      if (isiPhone)
      {
      …
      }
      

      检测 iPod

      var isiPod = /ipod/i.test(navigator.userAgent.toLowerCase());
      if (isiPod)
      {
      …
      }
      

      检测 iDevice

      var isiDevice = /ipad|iphone|ipod/i.test(navigator.userAgent.toLowerCase());
      
      if (isiDevice)
      {
      …
      }
      

      检测安卓

      var isAndroid = /android/i.test(navigator.userAgent.toLowerCase());
      
      if (isAndroid)
      {
      …
      }
      

      检测黑莓

      var isBlackBerry = /blackberry/i.test(navigator.userAgent.toLowerCase());
      
      if (isBlackBerry)
      {
      …
      }
      

      检测 WebOs

      var isWebOS = /webos/i.test(navigator.userAgent.toLowerCase());
      
      if (isWebOS)
      {
      …
      }
      

      检测 Windows Phone

      var isWindowsPhone = /windows phone/i.test(navigator.userAgent.toLowerCase());
      
      if (isWindowsPhone)
      {
      …
      }
      

      【讨论】:

      • 如果 i 在正则表达式中不区分大小写,为什么要在所有 UA 中添加 toLowerCase?
      • 这样你就不必写“blackberry”或“windows phone”或任何其他区分大小写的东西,现在每个人都知道它应该是大写还是小写,所以我认为它更简单。
      • 你不明白哈桑
      【解决方案8】:

      这里有很多答案。这是我的首要考虑。

      如果没有 JavaScript,包括用户出于安全目的最初在其浏览器中禁用 Javascript 的可能性,如果用户信任该站点,则用户将其列入白名单,DOM 将无法使用,因为 Javascript 已关闭。

      以编程方式,您需要考虑后端服务器端或前端客户端。

      借助后端,您可以使用共同的 HTTP“User-Agent”请求标头和/或浏览器发出的任何可能的专有 HTTP 请求标头来输出浏览器特定的 HTML 内容。

      对于客户端站点,您可能希望强制执行 Javascript 以允许您使用 DOM。如果是这样,那么您可能希望首先在 HTML 页面中使用以下内容:

      <noscript>This site requires Javascript. Please turn on Javascript.</noscript>
      

      虽然我们即将迎来每一位 Web 编码员都以某种方式(或不以某种方式)依赖 Javascript 的一天,但今天,假设每个用户都启用了 javascript 将是设计和产品开发质量检查的错误。

      我也见过很多网站最终会出现空白页面或网站崩溃,因为它假定每个用户都启用了 javascript。不可以。出于安全考虑,他们最初可能关闭了 Javascript,并且某些浏览器(例如 Chrome)将允许用户将网站按域列入白名单。 Edge 是我所知道的唯一浏览器,微软在哪里决定完全禁用用户关闭 Javascript 的能力。 Edge 不提供白名单概念,因此这是我个人不使用 Edge 的原因之一。

      使用标签是一种通知用户您的网站在没有 Javascript 的情况下将无法运行的简单方法。一旦用户打开它并刷新/重新加载页面,DOM 现在就可以使用线程回复中引用的技术来检测 chrome 与 safari。

      具有讽刺意味的是,我来到这里是因为我正在按平台进行更新,并在谷歌上搜索相同的基本问题;铬与萨拉菲。我不知道 Chrome 会创建一个名为“chrome”的 DOM 对象,这确实是您检测“chrome”与其他所有对象所需的全部内容。

      var isChrome = typeof(chrome) === "object";

      如果为真,您使用的是 Chrome,如果为假,您使用的是其他浏览器。

      检查 Safari 是否也创建了自己的 DOM 对象,如果是,则获取对象名称并执行相同的操作,例如:

      var isSafari = (typeof(safari) === "object");

      希望这些提示有所帮助。

      【讨论】:

      • Edge 也有 window.chrome 所以这没有帮助。
      【解决方案9】:

      jQuery 提供:

      if ($.browser.webkit){
          ...
      }
      

      进一步阅读http://api.jquery.com/jQuery.browser/

      更新

      正如其他答案/cmets 中所述,检查功能支持总是比检查代理信息更好。 jQuery 还为此提供了一个对象:jQuery.support。检查the documentation 以查看要检查的详细列表功能。

      【讨论】:

      • 请注意,这已被弃用。
      【解决方案10】:

      我用过这个:

       const isSafari = /^((?!android|windows|crios|fxios|opios|chrome|firefox|mercury|edge|ie|msie|trident|opera|opt).)*safari/i.test(navigator.userAgent);
      console.log(isSafari);

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2012-04-08
      • 2022-12-24
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多