我正在使用
var isSafari = /constructor/i.test(window.HTMLElement)
但它不适用于新的Safari 10。
关于使用什么的任何建议?
谢谢!
编辑:How to detect Safari, Chrome, IE, Firefox and Opera browser?仅涵盖最高版本9的Safari
答案 0 :(得分:6)
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
将涵盖从3.0到10(不是11)的所有Safari版本。
它仅检查Safari上流行的两种API转移。在9.1.3之前的版本中,.toString()
对象的HTMLElement
结果为[object HTMLElementConstructor]
,并且是Safari独有的。这在9.1.3之后的版本中得到修复。
对于较新版本,请检查[object SafariRemoteNotification]
对象,该对象是仅存在于现代Safari浏览器中的对象类型。
答案 1 :(得分:4)
我使用以下内容扩展了How to detect Safari, Chrome, IE, Firefox and Opera browser?中提到的safari检测行,并将其放在测试列表的底部:
isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || !isChrome && !isOpera && window.webkitAudioContext !== undefined;
在确定它不是Chrome或Opera之后,它基本上检查Web音频API是否使用webkit前缀。 (较早版本的Chrome和Opera也使用此前缀)
我前往caniuse.com查看哪些浏览器支持哪些功能,并尝试寻找一种特定于Safari的方式。我可以使用其他功能。 (可能会有更好的)。
我知道功能检测通常是更好的方法,但功能检测不会检测功能是否被破坏或根据浏览器提供不同的结果。