如何在Javascript中检测Safari 10浏览器?

4

4
不应再进行浏览器检测,而应该使用特性检测。 - Liam
@Liam 很遗憾,在那篇文章中,该解决方案是在 Safari 版本 3.0 - 9.0.3 中测试的,而不是在 10 中测试的。 - David R
1
这就是为什么你不应该使用浏览器检测的原因。 - Liam
3
抱歉,我的意思是在某些情况下,特征检测并不适用,因为问题与某些特征是否可用无关。我只是试图在Safari中禁用SVG滤镜,因为高斯模糊未产生预期结果,也似乎没有其他解决方法。 - catico
1
@Liam 对啊...但是你如何检测Safari的错误缓存HTTP范围请求的功能? - async5
显示剩余5条评论
2个回答

6
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);

将覆盖所有 Safari 版本,从 3.0 到 10(不包括 11)。

它检查了仅在 Safari 上流行的两个 API 变化。在 9.1.3 之前的版本中,HTMLElement 对象的 .toString() 结果为 [object HTMLElementConstructor],且仅适用于 Safari。这在 9.1.3 之后的版本中得到了修复。

对于更新的版本,请检查 [object SafariRemoteNotification] 对象,这是一种仅存在于现代 Safari 浏览器中的对象类型。


如果你想要捕获 Safari 3-10 版本,而不是 11 版本,那么这真的非常完美。正好符合我的需求。谢谢! - Chuck Le Butt
不客气!你找到如何检测Safari 11了吗? - pilau
我不需要检测Safari 11。 - Chuck Le Butt

6

我根据如何检测Safari、Chrome、IE、Firefox和Opera浏览器?提到的方法,扩展了safari检测行,并将其放置在测试列表底部:

isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || !isChrome && !isOpera && window.webkitAudioContext !== undefined;

它基本上检查Web Audio API是否在确保不是Chrome或Opera(旧版本的Chrome和Opera也使用了该前缀)之后使用了webkit前缀。
我去caniuse.com看哪些功能在哪些浏览器中得到支持,并尝试寻找一种以特定于Safari的方式突出显示的功能。可能还有其他功能可供使用(也可能有更好的功能)。
我知道功能检测通常是更好的方法,除非功能检测无法检测到功能是否损坏或根据浏览器提供不同的结果。

1
这是一个不完整的答案。它需要来自链接问题的代码才能正常运行。考虑到其他人可能会编辑那个答案,最好将所有需要的内容都放入这个答案中。 - Chuck Le Butt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接