如何检测Safari浏览器使用JavaScript?我尝试了下面的代码,它不仅检测Safari浏览器,而且还检测Chrome浏览器。
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
如何检测Safari浏览器使用JavaScript?我尝试了下面的代码,它不仅检测Safari浏览器,而且还检测Chrome浏览器。
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_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”
其他回答
也许这样行得通:
Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')
编辑:不再工作
为了记录,我发现最安全的方法是实现下面答案中的浏览器检测代码的Safari部分:
const isSafari = window['safari'] && safari.pushNotification &&
safari.pushNotification.toString() === '[object SafariRemoteNotification]';
当然,如果可能的话,处理特定于浏览器的问题的最佳方法总是进行特性检测。不过,使用上面这样的一段代码仍然比代理字符串检测要好。
只有Safari浏览器没有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!"; } <body id="idbody"> </body>
正如其他人已经注意到的,特性检测比检查特定浏览器更受欢迎。一个原因是用户代理字符串可以更改。另一个原因是字符串可能会在新版本中更改并破坏代码。
如果您仍然想要测试任何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上也可以)!