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

function IsSafari() {

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

}

当前回答

也许这样行得通:

Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')

编辑:不再工作

其他回答

就我而言,我需要同时在iOS和macOS上运行Safari。这招对我很管用:

if (/apple/i.test(navigator.vendor)) {
  // It's Safari
}

用户代理嗅探非常棘手且不可靠。我们尝试着用@qingu上面的回答去检测iOS上的Safari,它在Safari, Chrome和Firefox上都运行得很好。但它错误地将Opera和Edge检测为Safari。

所以我们使用了功能检测,就像今天一样,serviceWorker只在Safari中被支持,而在iOS上的任何其他浏览器中都不支持。如https://jakearchibald.github.io/isserviceworkerready/所述

支持不包括该平台上第三方浏览器的iOS版本(参见Safari支持)。

所以我们做了一些

if ('serviceWorker' in navigator) {
    return 'Safari';
}
else {
    return 'Other Browser';
}

注意:未在MacOS的Safari上测试。

只使用:

var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");

注意,这对于移动版本的Safari可能不可靠。

我不知道为什么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, Chrome, Firefox和Opera(桌面和iOS版本)中进行测试。首先,我们需要检测苹果供应商,然后排除Chrome, Firefox和Opera(用于iOS)。

let isSafari = navigator.vendor.match(/apple/i) &&
             !navigator.userAgent.match(/crios/i) &&
             !navigator.userAgent.match(/fxios/i) &&
             !navigator.userAgent.match(/Opera|OPT\//);

if (isSafari) {
  // Safari browser is used
} else {
  // Other browser is used
}