检测Safari浏览器

Tom*_*mas 119 javascript browser-detection

如何使用JavaScript检测Safari浏览器?我在下面尝试了代码,它不仅可以检测Safari,还可以检测Chrome浏览器.

function IsSafari() {

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

}
Run Code Online (Sandbox Code Playgroud)

fre*_*nte 134

注意:始终尝试检测您尝试修复的特定行为,而不是使用它进行定位isSafari?

作为最后的手段,使用此正则表达式检测Safari:

var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
Run Code Online (Sandbox Code Playgroud)

它使用负面外观,并且不包括Chrome,Edge以及Safari在其用户代理中包含该名称的所有Android浏览器.

  • 这是因为iOS上的所有浏览器都只是Safari的包装器(除了_Mini_模式下的Opera Mini),包括Chrome.这并不一定意味着他们将_all_匹配此测试,因为userAgent字符串取决于包装器.您可能需要单独[在iOS上检测Chrome](http://stackoverflow.com/a/13808053/288906). (23认同)
  • 这行不通。如果我在iPhone上使用Chrome浏览器,我仍然会理解。 (2认同)
  • 立即修复。您肯定是对的,许多浏览器的问题在于它们包含其他名称,以免被遗漏。Like Edge在其UA中同时包含Chrome和Safari。由于以下原因,用户代理检查不正确:浏览器发生变化,并且需要更新检查。不幸的是,没有完美的方法来检测浏览器,这总是一个猜测。 (2认同)
  • 使用功能检测绝对是个好主意,但有些行为很难或几乎不可能测试,例如移动设备上的视频是否自动全屏显示,这种情况只发生在 iPhone 和 iPod 上。要测试它,您需要加载视频并让用户播放它。 (2认同)
  • 无论如何,我发现 safari 的背景颜色属性在部分透明颜色值的情况下会默默失败。也就是说,它“确实”“渲染”了颜色,只是将其渲染为“透明”。任何覆盖的内容也将覆盖其他浏览器中的预期颜色。重点是,特征检测有时并不是正确的方法。 (2认同)

dav*_*vid 98

您可以轻松使用Chrome的索引来过滤Chrome:

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

  • @Flimm浏览器检测有许多合法用例.不要假定知道提问者或回答者的意图.虽然包含一个有用的提示是很好的,但您可能认为它是相关的,但这绝不是一个要求. (11认同)
  • 不行.目前在iPhone上输出chrome UA字符串,它甚至没有"chrome"字样. (6认同)
  • Windows 10中的IE 11 UA字符串还包含Safari和Chrome (4认同)
  • 被否决,作为不可靠的解决方案 - 下面有更好的答案。 (3认同)
  • 我们应该始终尝试进行特征检测,并将浏览器检测作为最后的手段,因为后者更有可能破坏并阻止合法用户。任何根本不涉及功能检测的答案都对我不利。 (2认同)
  • 如前所述,此方法不太成熟,这会将 Microsoft Edge 检测为 Chrome。 (2认同)

qin*_*ngu 75

正如其他人已经指出的那样,特征检测比检查特定浏览器更受欢迎.一个原因是可以更改用户代理字符串.另一个原因是字符串可能会更改并破坏新版本的代码.

如果你仍然想要测试任何Safari版本,我建议使用它

var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&
               navigator.userAgent &&
               navigator.userAgent.indexOf('CriOS') == -1 &&
               navigator.userAgent.indexOf('FxiOS') == -1;
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

编辑2

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

值得注意的是,iOS上的所有浏览器都只是Safari的包装器并使用相同的引擎.请参阅bfred.it在此主题中对自己答案的评论.

编辑3

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

  • 不幸的是,除了功能检测之外,还有更多的理由试图找出浏览器。浏览器可以支持一个功能,但有问题(例如:IE10 中的画布错误,但相同的功能在 IE9 中有效)。此外,Firefox 的行为与基于 webkit 的浏览器不同,例如它如何响应鼠标移动。Apple 的 Safari 存在 Chrome 中不存在的回流错误。在执行某些计算密集型任务时,某些浏览器的性能也比其他浏览器高。 (2认同)
  • @Andras对于Firefox你可以添加`&&!navigator.userAgent.match('FxiOS')`类似于Chrome检查 - 参考(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers /用户代理/ Firefox)的 (2认同)

luk*_*yer 37

只需使用:

var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这不是更高 - 这是完美的,简短的,简单的.由于缺少`getUserMedia`,我需要排除桌面游猎. (9认同)
  • 我应该指出,这仅适用于 macOS 上的 Safari,就我而言,这是完美的。谢谢! (8认同)
  • 不适用于移动Safari (5认同)
  • 我想警告大家,这不是一个可靠的检测方法。当我们意识到这在 iPad OS 和 iOS 上的 safari 中不起作用时,我们感到很困惑 (4认同)
  • 这在 iPhone 11 Pro Max Simulator 13.5 中不起作用 (3认同)
  • 这是确定桌面野生动物园的理想方法,因为这在移动设备上不起作用 (2认同)
  • 不适用于 iPhone X、iOS 11 (2认同)
  • 它对我不起作用。我在 mac 上使用 safari 版本 14.0 (15610.1.28.1.9, 15610) (2认同)
  • 或者,对于 TypeScript,请在​​窗口中使用“safari” (2认同)

wah*_*hid 18

此代码仅用于检测safari浏览器

if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) 
{
   alert("Browser is Safari");          
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码仅检测webkit浏览器不是chrome.许多其他浏览器都不好意思在其用户代理字符串中包含"safari".例如,Opera:`Mozilla/5.0(Macintosh; Intel Mac OS X 10_6_8)AppleWebKit/537.36(KHTML,像Gecko)Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51(下一个版本)`或者是Android版浏览器:`Mozilla/5.0(X11; Linux x86_64)AppleWebKit/534.24(KHTML,像Gecko)Chrome/11.0.696.34 Safari/534.24` (4认同)

Inf*_*gon 16

检测手势更改支持,如下所示:

const isSafari = !!window.GestureEvent
document.write(isSafari ? "You are using Safari." : "You are not using Safari.")
Run Code Online (Sandbox Code Playgroud)

漂亮又简单;适用于 iOS 和 Android!如果您需要 ES5 支持,请替换constvar.

  • @Hicka你可以检查 `typeof window.GestureEvent === 'function'` (3认同)
  • 或者:`if ('GestureEvent' in window) {window.alert('这是 WebKit');}`。请注意,此检查检测的是 **WebKit** 而不是 Safari - 但如果您正在寻找与桌面上的 Safari 和 iOS 上的_所有_浏览器(在 iOS、Chrome Mobile、Safari Mobile 等上都只是 Safari Mobile,具有不同的名称)的匹配项皮肤)检测 WebKit(而不是“Safari”)可能就是您想要的。 (3认同)

小智 11

我不知道为什么 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>
Run Code Online (Sandbox Code Playgroud)

澄清:

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


Sim*_*one 11

就我而言,我需要同时在 iOS 和 macOS 上针对 Safari。这对我有用:

if (/apple/i.test(navigator.vendor)) {
  // It's Safari
}
Run Code Online (Sandbox Code Playgroud)

  • 不起作用!它仅检测是 iOS 还是 macOS。如果我使用 Firefox、Chrome 或 Opera,它仍然显示我使用 Safari... (2认同)
  • 为何如此?在 Chrome 上,“navigator.vendor”是“Google Inc.”,因此测试返回“false”(不是 Safari)。Firefox 为我返回一个空字符串,其计算结果也为“false”。所以这对于检测 Safari 来说通常效果很好。 (2认同)

tyl*_*ell 10

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

苹果浏览器

navigator.vendor ==  "Apple Computer, Inc."
Run Code Online (Sandbox Code Playgroud)

navigator.vendor ==  "Google Inc."
Run Code Online (Sandbox Code Playgroud)

FireFox(为什么它是空的?)

navigator.vendor ==  ""
Run Code Online (Sandbox Code Playgroud)

IE(为什么它未定义?)

navigator.vendor ==  undefined
Run Code Online (Sandbox Code Playgroud)


小智 7

只有Safari whitout Chrome:

在尝试其他代码后,我没有发现任何适用于新旧版本的Safari.

最后,我做了这个代码,对我来说效果非常好:

var ua = navigator.userAgent.toLowerCase(); 
var isSafari = false;
try {
  isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
}
catch(err) {}
isSafari = (isSafari || ((ua.indexOf('safari') != -1)&& (!(ua.indexOf('chrome')!= -1) && (ua.indexOf('version/')!= -1))));

//test
if (isSafari)
{
  //Code for Safari Browser (Desktop and Mobile)
  document.getElementById('idbody').innerHTML = "This is Safari!";
}
else
{
  document.getElementById('idbody').innerHTML = "Not is Safari!";
}
Run Code Online (Sandbox Code Playgroud)
<body id="idbody">
</body>
Run Code Online (Sandbox Code Playgroud)


Pio*_*ski 6

我观察到只有一个词可以区分 Safari - “版本”。所以这个正则表达式将完美运行:

/.*Version.*Safari.*/.test(navigator.userAgent)
Run Code Online (Sandbox Code Playgroud)


lov*_*ong 5

我用这个

function getBrowserName() {
    var name = "Unknown";
    if(navigator.userAgent.indexOf("MSIE")!=-1){
        name = "MSIE";
    }
    else if(navigator.userAgent.indexOf("Firefox")!=-1){
        name = "Firefox";
    }
    else if(navigator.userAgent.indexOf("Opera")!=-1){
        name = "Opera";
    }
    else if(navigator.userAgent.indexOf("Chrome") != -1){
        name = "Chrome";
    }
    else if(navigator.userAgent.indexOf("Safari")!=-1){
        name = "Safari";
    }
    return name;   
}

if( getBrowserName() == "Safari" ){
    alert("You are using Safari");
}else{
    alert("You are surfing on " + getBrowserName(name));
}
Run Code Online (Sandbox Code Playgroud)


Sud*_*arP 5

最简单的答案:

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

  • 更简单...`if (navigator.vendor.match(/apple/i)) { ... }`。 (6认同)
  • 它可以工作,尽管没有正则表达式可以更简单:`navigator.vendor.toLowerCase().indexOf('apple') &gt; -1` (3认同)
  • @nuttynibbles:这可能就是你想要的,因为 iOS 上的每个浏览器都是伪装的 Safari。 (3认同)

Mic*_*lyk 5

阅读许多答案和帖子并确定最准确的解决方案。在 Safari、Chrome、Firefox(桌面和 iOS 版本)中测试。首先我们需要检测Apple供应商,然后排除 Chrome 和 Firefox(适用于 iOS)。

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

if (isSafari) {
  //
} else {
  //
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

164725 次

最近记录:

6 年,5 月 前