使用 jQuery.browser 区分 Chrome 和 Safari

Posted

技术标签:

【中文标题】使用 jQuery.browser 区分 Chrome 和 Safari【英文标题】:Distinguish Chrome from Safari using jQuery.browser 【发布时间】:2011-03-19 05:54:44 【问题描述】:

从 1.4 开始,jQuery.browser 似乎能够相当容易地识别 webkit。但是如何使用它来区分 Chrome 和 Safari(反之亦然)?

【问题讨论】:

【参考方案1】:

您也可以尝试使用这种方法,它对我有用。

    isSafari: function () 
    
            var isSafari = (navigator.userAgent.indexOf('Safari') != -1
                        && navigator.userAgent.indexOf('Chrome') == -1)

            console.log('IsSafari : ' + isSafari);

            return isSafari;
    ,

【讨论】:

【参考方案2】:

没有 jQuery

isChrome = function()  
  return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

isSafari = function() 
  return /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);


使用 jQuery

(以下不适用于 jQuery 1.9 及更高版本,因为 jQuery.browser 已从 jQuery 中删除。请参阅 http://api.jquery.com/jQuery.browser/)

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

【讨论】:

第一个解决方案非常优雅。 为什么!! chrome 是什么意思? 很遗憾 $.browser 被删除了。但是我们如何从 1.10 检测到呢?我在 API 文档中没有看到任何内容。【参考方案3】:

由于 Sarfraz 没有更正他的答案(感谢 Sarfraz 为我指出正确的方向),我将在此处发布功能代码。

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

// Is this a version of Chrome?
if($.browser.chrome)
  userAgent = userAgent.substring(userAgent.indexOf('chrome/') +7);
  userAgent = userAgent.substring(0,userAgent.indexOf('.'));
  $.browser.version = userAgent;
  // If it is chrome then jQuery thinks it's safari so we have to tell it it isn't
  $.browser.safari = false;


// Is this a version of Safari?
if($.browser.safari)
  userAgent = userAgent.substring(userAgent.indexOf('version/') +8);
  userAgent = userAgent.substring(0,userAgent.indexOf('.'));
  $.browser.version = userAgent;

【讨论】:

对于 safari,$.browser.version 最终会为您提供 webkit 的版本,而不是 safari 的版本。尝试 userAgent.indexOf('Version/') + 8 代替。 另外,您可以在userAgent = userAgent.substring(0,userAgent.indexOf('.')); 的行上使用子串直到空格字符而不是句点,以获得完整的版本号,而不仅仅是版本号的第一部分(主要编号) . @David,您需要在 'Version/' 字符串中使用小写的 v,因为前面的代码中用户代理字符串是小写的。【参考方案4】:

也适用于非 JQuery 用户:

    navigator.userAgent.indexOf('WebKit') + 1 ? 
       ((navigator.vendor || '').indexOf('Apple') + 1 ? /* Safari */ : /* Chrome */)
    : /* not Webkit */

http://jsfiddle.net/HtWag/13/

【讨论】:

这对我有用。如果您不习惯这种条件语句,那么通读它会有点技巧,但是您将其布置得很好。非常感谢。【参考方案5】:
window.chrome?$.browser.chrome=!0:($.browser.webkit&&($.browser.safari=!0),$.browser.chrome=!1);

此补丁添加了 $.browser.chrome 并从 $.browser.safari

中排除了 Goolge Chrome 检测

【讨论】:

【参考方案6】:
/Chrome/.test(navigator.userAgent)

【讨论】:

【参考方案7】:

你可以这样做:

// Is this a version of Chrome?
if($.browser.chrome)
  userAgent = userAgent.substring(userAgent.indexOf('chrome/') +7);
  userAgent = userAgent.substring(0,userAgent.indexOf('.'));
  version = userAgent;
  // If it is chrome then jQuery thinks it's safari so we have to tell it it isn't
  $.browser.safari = false;


// Is this a version of Safari?

if($.browser.safari)
  userAgent = userAgent.substring(userAgent.indexOf('safari/') +7);
  userAgent = userAgent.substring(0,userAgent.indexOf('.'));
  version = userAgent;

http://api.jquery.com/jQuery.browser/

【讨论】:

嗯——$.browser.chrome 未定义。并且 $.browser.safari 对 chrome 和 safari 都适用 @sAc,你很接近,这应该出现在你提供的代码之前:var userAgent = navigator.userAgent.toLowerCase(); $.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase()); var version = 0; @sAc,另外,version 变量是不需要的,应该用$.browser.version 替换。 @sAc,我愿意接受你的回答,因为它让我走上了正轨——但只要它包含不可操作的代码,我就无法这样做。请编辑您的答案以更正上述错误。 @kingjeffrey:我发布了来自 jquery 文档的代码,我的答案中发布了链接,它不是我写的。这些 cmets 中已经提到了任何修复:)

以上是关于使用 jQuery.browser 区分 Chrome 和 Safari的主要内容,如果未能解决你的问题,请参考以下文章

关于jquery $.browser 报错问题

jQuery.browser:Javascript 未捕获的类型错误

jquery1.9不支持browser对象的解决方案

jQuery升级踩坑之路

使用jQuery排除IE9之前的IE版本

JQMIGRATE:jQuery.browser 已弃用,无法读取未定义的属性“mozilla”