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

function IsSafari() {

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

}

当前回答

这个独特的“问题”是100%的标志,浏览器是Safari(信不信由你)。

if (Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').descriptor === false) {
   console.log('Hello Safari!');
}

这意味着cookie对象描述符在Safari上设置为假,而在其他所有项目上设置为真,这实际上让我在其他项目上头疼。编码快乐!

其他回答

简单的回答是:

function isSafari() {
 if (navigator.vendor.match(/[Aa]+pple/g).length > 0 ) 
   return true; 
 return false;
}

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

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

基于@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
}

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

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

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

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

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