使用jQuery检测Safari

问题描述:

尽管两者都是基于Webkit的浏览器,但Safari并未在URL中引用引号,而Chrome却没有。使用jQuery检测Safari

因此我需要在JS中区分这两个。

jQuery's browser detection docs将“safari”标记为不建议使用。

有没有更好的方法,或者我现在只坚持弃用的值?

+0

我不知道,如果坚持它是一个好主意,我还没有深入检查了这一点,虽然我只是浏览Chrome上的$ .browser文档和它的标志'$ .browser .safari === true'。 eeek。 – davin 2011-05-05 15:03:34

+1

[如何检测Safari,Chrome,IE,Firefox和Opera浏览器]的可能重复(http://*.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-浏览器)**没有用户代理嗅探** ?. – 2012-05-25 10:44:46

使用的feature detection混合和Useragent字符串:

var is_chrome = !!window.chrome && !is_opera; 
    var is_explorer= typeof document !== 'undefined' && !!document.documentMode && !isEdge; 
    var is_firefox = typeof window.InstallTrigger !== 'undefined'; 
    var is_safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); 
    var is_opera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; 

用法:
if (is_safari) alert('Safari');

或Safari浏览器只,用这个:

if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {alert('Its Safari');} 
+2

以48票与5票的比例为特征检测与副作用,显然这是推荐的解决方案。 :)让它接受答案。 – AndreKR 2013-09-05 16:08:53

+1

作为这种事情有多脆弱的一个例子,这段代码没有检测到Internet Explorer 11,因为UA字符串已经改变。请参阅http://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx – 2014-03-19 10:16:13

+1

Android的webview也会说Safari,这是不正确的 – Curtis 2014-06-16 23:39:53

如果您正在检查浏览器使用$.browser。但是,如果您正在检查功能支持(推荐),然后使用$.support

您不应该使用$ .browser来启用/禁用页面上的功能。原因是它不可靠,一般不推荐。

如果您需要功能支持,那么我建议您使用modernizr

+3

所有的真实的,但并不特别相关... – davin 2011-05-05 15:05:38

+0

教一个人钓鱼...“有更好的方法” - 是的,功能检测。 – 2011-05-05 22:03:49

+0

你的意思是'location.hash =''blah''; if(location.hash =='#%22blah%22')alert('是Safari');'? – AndreKR 2011-05-06 12:26:25

显然,唯一可靠的和接受的解决方案是做功能检测是这样的:

browser_treats_urls_like_safari_does = false; 
var last_location_hash = location.hash; 
location.hash = '"blah"'; 
if (location.hash == '#%22blah%22') 
    browser_treats_urls_like_safari_does = true; 
location.hash = last_location_hash; 
+2

好戏,但不幸的是它不起作用。由于location.hash处理字符串的方式,相等(location.hash =='#%22blah%22')将不起作用。 :/ – 2011-10-14 12:45:04

+1

特征检测是要走的路,但有一个更好的方法,它没有任何副作用。您的代码段可能会干扰依赖于散列更改事件的其他脚本。我将问题标记为[this]的副本(http://*.com/a/9851769/938089?how-to-detect-safari-chrome-ie-firefox-and-opera-browser)。我已经在Safari 3.0-5.1.3(Mac和Windows)中创建和测试了该方法。这是一个单线:) – 2012-05-25 10:42:57

对于检查Safari浏览器我用这个:

$.browser.safari = ($.browser.webkit && !(/chrome/.test(navigator.userAgent.toLowerCase()))); 
if ($.browser.safari) { 
    alert('this is safari'); 
} 

它正常工作。

+0

@tranzitoria - 感谢它为我工作+1 ...... – ELAYARAJA 2013-08-31 11:03:38

+3

被删除与jquery 1.9 http://api.jquery.com/jQuery.browser/ – Chris 2013-11-23 12:34:52

以下标识Safari 3.0以上,并从Chrome中区分开来:

isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/) 
+10

这一个为我工作的时候没有其他人,谢谢。 – andygoestohollywood 2013-12-05 10:55:03

+3

只有这个作品 – fdrv 2016-04-06 08:33:31

+1

这就是事情。 TNX! – 2016-06-21 17:32:42

不幸的是,上面的例子中还将检测Android的默认浏览器如Safari,它不是。 我用 navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1

泛型函数

getBrowseActive = function (browserName) { 
    if (navigator.userAgent.indexOf(browserName) > -1) 
    return true; 

    return false; 
}; 

解决这个问题是检测浏览器的WebKit版本,并检查它是否是至少我们需要的一个,其他人做点别的一个非常有用的方法。

使用jQuery它是这样的:

"use strict"; 
 

 
$(document).ready(function() { 
 
    var appVersion     = navigator.appVersion; 
 
    var webkitVersion_positionStart = appVersion.indexOf("AppleWebKit/") + 12; 
 
    var webkitVersion_positionEnd = webkitVersion_positionStart + 3; 
 
    var webkitVersion    = appVersion.slice(webkitVersion_positionStart, webkitVersion_positionEnd); 
 
\t 
 
    console.log(webkitVersion); 
 

 
    if (webkitVersion < 537) { 
 
     console.log("webkit outdated."); 
 
    } else { 
 
     console.log("webkit ok."); 
 
    }; 
 
});

这提供了一个安全和永久修复的处理与浏览器的不同webkit的实现问题。

快乐编码!

//Check if Safari 
    function isSafari() { 
     return /^((?!chrome).)*safari/i.test(navigator.userAgent); 
    } 
//Check if MAC 
    if(navigator.userAgent.indexOf('Mac')>1){ 
     alert(isSafari()); 
    } 

http://jsfiddle.net/s1o943gb/10/

我发现被检查的navigator.userAgent包含iPhone或iPad字

if (navigator.userAgent.toLowerCase().match(/(ipad|iphone)/)) { 
    //is safari 
} 

这将决定浏览器是否为Safari或不是唯一的方式。

if(navigator.userAgent.indexOf('Safari') !=-1 && navigator.userAgent.indexOf('Chrome') == -1) 
{ 
    alert(its safari); 
}else { 
    alert('its not safari'); 
} 
+0

不幸的是,不工作。在Chrome v66和Safari上测试。 – 2018-01-23 20:14:10