如何使用JavaScript检测Safari浏览器?我在下面尝试过代码,它不仅可以检测Safari,还可以检测Chrome浏览器。
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
如何使用JavaScript检测Safari浏览器?我在下面尝试过代码,它不仅可以检测Safari,还可以检测Chrome浏览器。
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
Answers:
您可以轻松地使用Chrome的索引来过滤掉Chrome:
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('safari') != -1) {
if (ua.indexOf('chrome') > -1) {
alert("1") // Chrome
} else {
alert("2") // Safari
}
}
注意:请始终尝试检测要修复的特定行为,而不要使用isSafari?
作为最后的手段,使用此正则表达式检测Safari:
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
它使用否定性环顾,并且不包括Chrome,Edge和所有Safari
在其用户代理中包含该名称的Android浏览器。
正如其他人已经指出的那样,相比于检查特定的浏览器,功能检测更为可取。原因之一是可以更改用户代理字符串。另一个原因是该字符串可能会更改,并在较新的版本中破坏您的代码。
如果您仍然想要这样做并测试任何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。
要在当前浏览器中进行测试:https : //jsfiddle.net/j5hgcbm2/
已根据Chrome文档更新,以正确检测iOS上的Chrome
值得注意的是,iOS上的所有浏览器都只是Safari的包装器,并且使用相同的引擎。请参阅bfred.it在此线程中对自己答案的评论。
根据Firefox文档进行了更新,以正确检测iOS上的Firefox
isSafari
否则将true
在Safari浏览器中false
。您可以简单地使用上面的代码段,然后几乎在发布时使用您的代码段。if (isSafari) { do_this(); } else { do_that(); }
。
只需使用:
var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");
getUserMedia
。
此代码仅用于检测野生动物园浏览器
if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0)
{
alert("Browser is Safari");
}
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51 (Edition Next)
,或Stock Android浏览器:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
由于chrome和safari的userAgent几乎相同,因此可以更轻松地了解浏览器的供应商
苹果浏览器
navigator.vendor == "Apple Computer, Inc."
铬
navigator.vendor == "Google Inc."
FireFox(为什么它为空?)
navigator.vendor == ""
IE(为什么未定义?)
navigator.vendor == undefined
仅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-“版本”。因此,此正则表达式将完美运行:
/.*Version.*Safari.*/.test(navigator.userAgent)
我不知道为什么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>
澄清:
我用这个
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));
}
最简单的答案:
function isSafari() {
if (navigator.vendor.match(/[Aa]+pple/g).length > 0 )
return true;
return false;
}
navigator.vendor.toLowerCase().indexOf('apple') > -1
if (navigator.vendor.match(/apple/i)) { ... }
。
对于记录,我找到的最安全的方法是从此答案中实现浏览器检测代码的Safari部分:
const isSafari = window['safari'] && safari.pushNotification &&
safari.pushNotification.toString() === '[object SafariRemoteNotification]';
当然,处理浏览器特定问题的最佳方法始终是进行特征检测(如果可能的话)。但是,使用类似上面的代码仍然比代理字符串检测更好。
我知道这个问题很旧,但我还是想发布答案,因为它可能会对某人有所帮助。上述解决方案在某些情况下是失败的,因此我们必须以分别处理iOS,桌面和其他平台的方式来实现它。
function isSafari() {
var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iP(ad|od|hone)/i);
var hasSafariInUa = !!ua.match(/Safari/i);
var noOtherBrowsersInUa = !ua.match(/Chrome|CriOS|OPiOS|mercury|FxiOS|Firefox/i)
var result = false;
if(iOS) { //detecting Safari in IOS mobile browsers
var webkit = !!ua.match(/WebKit/i);
result = webkit && hasSafariInUa && noOtherBrowsersInUa
} else if(window.safari !== undefined){ //detecting Safari in Desktop Browsers
result = true;
} else { // detecting Safari in other platforms
result = hasSafariInUa && noOtherBrowsersInUa
}
return result;
}
修改正则表达式以回答以上问题
var isSafari = /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent);
这个独特的“问题”是100%表示浏览器是Safari(信不信由你)。
if (Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').descriptor === false) {
console.log('Hello Safari!');
}
这意味着cookie对象描述符在Safari上设置为false,而其他所有对象都为true,这实际上使我对另一个项目感到头疼。编码愉快!
也许这可行:
Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')
编辑:不再工作
用户代理嗅探确实是棘手且不可靠的。我们试图通过上面@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上进行测试。