Как обнаружить браузер 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. Возможно, есть другие возможности, которые я мог бы использовать. (и могут быть лучшие).
Я знаю, что обнаружение функции обычно является лучшим способом, за исключением того, что обнаружение функции не обнаруживает нарушения функции или дает разные результаты в зависимости от браузера.