Как обнаружить браузер Safari 10 в Javascript?

Я использовал

var isSafari = /constructor/i.test(window.HTMLElement)

но он не работает для нового Safari 10.

Любые советы о том, что использовать?

Спасибо!

edit: Как обнаружить браузер Safari, Chrome, IE, Firefox и Opera? охватывает только Safari до версии 9

Ответ 1

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

Покроет всю версию Safari с 3.0 и до 10 (не 11).

Он проверяет наличие двух переходов API, распространенных только на Safari. В версиях до 9.1.3 результат .toString() объекта HTMLElement равен [object HTMLElementConstructor] и уникален для Safari. Это было исправлено в версиях после 9.1.3.

Для более новых версий проверьте объект [object SafariRemoteNotification], который является типом объекта, который существует только в современных браузерах Safari.

Ответ 2

Я расширил строку обнаружения сафари, как указано в Как определить браузер Safari, Chrome, IE, Firefox и Opera? со следующим и поместил его внизу список тестов:

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

В основном он проверяет, использует ли веб-аудио API префикс webkit, убедившись, что это не Chrome или Opera. (более старые версии Chrome и Opera также использовали этот префикс)

Я пошел в caniuse.com, чтобы узнать, какие функции поддерживаются в браузерах, и попытался найти тот, который выделяется таким образом, чтобы специфичен для Safari. Возможно, есть другие возможности, которые я мог бы использовать. (и могут быть лучшие).

Я знаю, что обнаружение функции обычно является лучшим способом, за исключением того, что обнаружение функции не обнаруживает нарушения функции или дает разные результаты в зависимости от браузера.