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

function IsSafari() {

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

}

当前回答

正如其他人已经注意到的,特性检测比检查特定浏览器更受欢迎。一个原因是用户代理字符串可以更改。另一个原因是字符串可能会在新版本中更改并破坏代码。

如果您仍然想要测试任何Safari版本,我建议使用这个

var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&
               navigator.userAgent &&
               navigator.userAgent.indexOf('CriOS') == -1 &&
               navigator.userAgent.indexOf('FxiOS') == -1;

这将适用于所有设备上的任何版本的Safari: Mac, iPhone, iPod, iPad。

Edit

要在当前浏览器中测试:https://jsfiddle.net/j5hgcbm2/

编辑2

根据Chrome文档更新,以正确检测iOS上的Chrome

值得注意的是,iOS上的所有浏览器都只是Safari的包装,使用相同的引擎。看到bfred。这是他在这个帖子里对自己的回答的评论。

编辑3

根据Firefox文档更新,以正确检测iOS上的Firefox

其他回答

正如其他人已经注意到的,特性检测比检查特定浏览器更受欢迎。一个原因是用户代理字符串可以更改。另一个原因是字符串可能会在新版本中更改并破坏代码。

如果您仍然想要测试任何Safari版本,我建议使用这个

var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&
               navigator.userAgent &&
               navigator.userAgent.indexOf('CriOS') == -1 &&
               navigator.userAgent.indexOf('FxiOS') == -1;

这将适用于所有设备上的任何版本的Safari: Mac, iPhone, iPod, iPad。

Edit

要在当前浏览器中测试:https://jsfiddle.net/j5hgcbm2/

编辑2

根据Chrome文档更新,以正确检测iOS上的Chrome

值得注意的是,iOS上的所有浏览器都只是Safari的包装,使用相同的引擎。看到bfred。这是他在这个帖子里对自己的回答的评论。

编辑3

根据Firefox文档更新,以正确检测iOS上的Firefox

检测手势变化,像这样:

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

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

基于@SudarP的回答。

在2021年Q3,这个解决方案将失败在Firefox (Uncaught TypeError: navigator.vendor.match(…)是null)和Chrome (Uncaught TypeError:不能读取null属性(读取'length'));

所以这里有一个固定且简短的解决方案:

function isSafari() {
  return (navigator.vendor.match(/apple/i) || "").length > 0
}

你可以很容易地使用索引的Chrome过滤Chrome:

var ua = navigator.userAgent.toLowerCase(); 
if (ua.indexOf('safari') != -1) { 
  if (ua.indexOf('chrome') > -1) {
    alert("1") // Chrome
  } else {
    alert("2") // Safari
  }
}

我创建了一个返回布尔类型的函数:

export const isSafari = () => navigator.userAgent.toLowerCase().indexOf('safari') !== -1