2011-05-05 55 views
92

儘管兩者都是基於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://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-瀏覽器)**沒有用戶代理嗅探** ?. – 2012-05-25 10:44:46

回答

290

使用的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

1

如果您正在檢查瀏覽器使用$.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

3

顯然,唯一可靠的和接受的解決方案是做功能檢測是這樣的:

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://stackoverflow.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

7

對於檢查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

60

以下標識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

9

不幸的是,上面的例子中還將檢測Android的默認瀏覽器如Safari,它不是。 我用 navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1

0

泛型函數

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

    return false; 
}; 
0

解決這個問題是檢測瀏覽器的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的實現問題。

快樂編碼!

0
//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/

2

我發現被檢查的navigator.userAgent包含iPhone或iPad字

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

這將決定瀏覽器是否爲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