如何检测Safari浏览器使用JavaScript?我尝试了下面的代码,它不仅检测Safari浏览器,而且还检测Chrome浏览器。

function IsSafari() {

  var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
  return is_safari;

}

当前回答

因为chrome和safari的userAgent几乎是相同的,所以可以更容易地查看浏览器的供应商

Safari

navigator.vendor ==  "Apple Computer, Inc."

navigator.vendor ==  "Google Inc."

FireFox(为什么是空的?)

navigator.vendor ==  ""

IE(为什么没有定义?)

navigator.vendor ==  undefined

其他回答

我不知道为什么OP想要检测Safari,但在极少数情况下,您需要嗅探浏览器,可能更重要的是检测渲染引擎比浏览器的名称。例如,在iOS上,所有浏览器都使用Safari/Webkit引擎,所以如果底层渲染器实际上是Safari/Webkit,那么将“chrome”或“firefox”作为浏览器名称是毫无意义的。我还没有在旧的浏览器上测试这段代码,但它适用于最近的Android、iOS、OS X、Windows和Linux。

<script>
    let browserName = "";

    if(navigator.vendor.match(/google/i)) {
        browserName = 'chrome/blink';
    }
    else if(navigator.vendor.match(/apple/i)) {
        browserName = 'safari/webkit';
    }
    else if(navigator.userAgent.match(/firefox\//i)) {
        browserName = 'firefox/gecko';
    }
    else if(navigator.userAgent.match(/edge\//i)) {
        browserName = 'edge/edgehtml';
    }
    else if(navigator.userAgent.match(/trident\//i)) {
        browserName = 'ie/trident';
    }
    else
    {
        browserName = navigator.userAgent + "\n" + navigator.vendor;
    }
    alert(browserName);
</script>

澄清:

iOS下的所有浏览器都会报告为“safari/webkit” 除Firefox外,Android下的所有浏览器都将报告为“chrome/blink” Chrome, Opera, Blisk, Vivaldi等在Windows, OS X或Linux下都将被报告为“Chrome /blink”

为了记录,我发现最安全的方法是实现下面答案中的浏览器检测代码的Safari部分:

const isSafari = window['safari'] && safari.pushNotification &&
    safari.pushNotification.toString() === '[object SafariRemoteNotification]';

当然,如果可能的话,处理特定于浏览器的问题的最佳方法总是进行特性检测。不过,使用上面这样的一段代码仍然比代理字符串检测要好。

检测手势变化,像这样:

const isSafari = 窗口类型。手势事件 === “函数” document.getElementById(“result”).textContent = isSafari ?“野生动物园!” :“不是野生动物园!” <div id=“result” style=“font-family: sans-serif”></div>

手势改变只在Safari上得到了广泛的支持(iOS上也可以)!

为上面的答案修改正则表达式

var isSafari = /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent);

低温-铬 fxios - Firefox

我知道这个问题很老了,但我还是想把答案贴出来,因为它可能会帮助到别人。上述解决方案在某些极端情况下是失败的,所以我们必须以一种分别处理iOS、Desktop和其他平台的方式来实现它。

function isSafari() {
    var ua = window.navigator.userAgent;
    var iOS = !!ua.match(/iP(ad|od|hone)/i);
    var hasSafariInUa = !!ua.match(/Safari/i);
    var noOtherBrowsersInUa = !ua.match(/Chrome|CriOS|OPiOS|mercury|FxiOS|Firefox/i)
    var result = false;
    if(iOS) { //detecting Safari in IOS mobile browsers
        var webkit = !!ua.match(/WebKit/i);
        result = webkit && hasSafariInUa && noOtherBrowsersInUa
    } else if(window.safari !== undefined){ //detecting Safari in Desktop Browsers
        result = true;
    } else { // detecting Safari in other platforms
        result = hasSafariInUa && noOtherBrowsersInUa
    }
    return result;
}