如何使用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;
}
注意:在定位和修复问题时,请尽可能检测特定的行为,而不是使用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
根据Firefox文档更新,以正确检测iOS上的Firefox
&& !navigator.userAgent.match('FxiOS')
,类似于 Chrome 检查 - 参考文献(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox)。 - Petri Pellinen您可以轻松使用Chrome的索引来过滤Chrome:
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('safari') != -1) {
if (ua.indexOf('chrome') > -1) {
alert("1") // Chrome
} else {
alert("2") // Safari
}
}
只需使用:
var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");
请注意,在Safari移动版中,这可能不可靠。
getUserMedia
功能而导致的问题。 - Stephen Tetreault这段代码用于检测仅限Safari浏览器
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)
或者原生的Android浏览器:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
。 - rupps阅读了许多答案和帖子,并确定了最准确的解决方案。在Safari、Chrome、Firefox和Opera(桌面版和iOS版本)中进行了测试。首先,我们需要检测Apple
供应商,然后排除Chrome、Firefox和Opera(适用于iOS)。
let isSafari = navigator.vendor.match(/apple/i) &&
!navigator.userAgent.match(/crios/i) &&
!navigator.userAgent.match(/fxios/i) &&
!navigator.userAgent.match(/Opera|OPT\//);
if (isSafari) {
// Safari browser is used
} else {
// Other browser is used
}
由于Chrome和Safari的userAgent几乎相同,因此查看浏览器的供应商可能更容易。
Safari
navigator.vendor == "Apple Computer, Inc."
Chrome
navigator.vendor == "Google Inc."
火狐浏览器(为什么是空的?)
navigator.vendor == ""
IE(为什么它未定义?)
navigator.vendor == undefined
const isSafari = !!window.GestureEvent
document.write(isSafari ? "You are using Safari." : "You are not using Safari.")
const
替换为var
。typeof window.GestureEvent === 'function'
сђѓТёЈТђЮТў»ТБђТЪЦwindow.GestureEvent
уџёу▒╗тъІТў»тљдТў»тЄйТЋ░сђѓ - Jankapunkt我不知道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和macOS上的Safari进行操作。这对我起作用:
if (/apple/i.test(navigator.vendor)) {
// It's Safari
}
Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
- mikepnavigator.vendor === "Apple Computer, Inc."
? - Newbytenavigator.vendor
可能包含什么内容,但在我的特定情况下,我需要针对任何苹果浏览器进行操作,所以正则表达式对我很有用。 - Simonenavigator.vendor
是Google Inc.
,因此测试返回false
(它不是Safari)。Firefox对我来说返回一个空字符串,这也被评估为false
。因此,这似乎很好地用于检测Safari。 - Simone