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

cat*_*ico 4 javascript browser safari

我在用

var isSafari = /constructor/i.test(window.HTMLElement)
Run Code Online (Sandbox Code Playgroud)

但它不适用于新的Safari 10.

关于使用什么的任何建议?

谢谢!

编辑:如何检测Safari,Chrome,IE,Firefox和Opera浏览器?仅适用于版本9的Safari

小智 6

如我如何检测Safari,Chrome,IE,Firefox和Opera浏览器中所述,我扩展了safari检测行与以下内容并将其放在测试列表的底部:

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

在确定它不是Chrome或Opera之后,它基本上会检查网络音频API是否正在使用webkit前缀。(旧版的Chrome和Opera也使用了此前缀)

我去caniuse.com看看哪些浏览器支持哪些功能,并尝试寻找一种以Safari特有的方式脱颖而出的功能。我可能还可以使用其他功能。(并且可能会有更好的选择)。

我知道功能检测通常是更好的方法,除了功能检测不能检测功能是否损坏或根据浏览器给出不同的结果。


pil*_*lau 6

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

将覆盖所有版本的Safari从3.0到10(不是11).

它仅检查Safari上流行的两种API转移.在9.1.3之前的版本中.toString(),HTMLElement对象的结果[object HTMLElementConstructor]是Safari独有的.这在9.1.3之后的版本中得到修复.

对于较新的版本,请检查[object SafariRemoteNotification]对象类型,该对象类型仅存在于现代Safari浏览器中.