Каков наиболее надежный подход к обнаружению поддержки функций браузера?
Скажем, я хочу обнаружить поддержку уведомлений (http://notifications.spec.whatwg.org/) в библиотеке JavaScript.
Я могу использовать window.Notification !== undefined
. Но что, если пользователи библиотеки (или другой библиотеки) также имеют какой-то глобальный объект Notification
, определенный для совершенно другой цели?
С другой стороны, что, если другая библиотека является polyfill? Тогда их объект Notification
является приемлемым. Должен ли я тестировать все методы в дополнение к тестированию для глобального объекта?
Обновление:
Я заметил интересную вещь в одном уведомлениях polyfill:
ret[toString] = function() {
return 'function Notification() { [native code] }';
};
Насколько надежно полагается что-то подобное, чтобы определить, является ли он родным / polyfill объектом?
Ответы
Ответ 1
Таким образом, по существу есть два варианта.
Сначала нужно попробовать и полагаться на значение 'function Notification() { [native code] }'
toString
, поскольку оно задается по меньшей мере несколькими полиполками. К сожалению, это ненадежно, поскольку я не нашел информации о том, является ли это общим подходом в polyfill авторах и является ли это надежным возвращаемым значением в браузерах.
Другой вариант, как предлагается в комментариях, состоит в том, чтобы игнорировать потенциальные конфликты и просто идти вперед, просто проверяя существование. Это то, к чему я пошел сейчас.
Ответ 2
Вы всегда можете использовать подход jQuery и переопределять все, что ссылается на ранее существующее окно. Обозначения с чем-то вроде:
window._Notification = window.Notification;
Пол Ирландский немного в это видео, которое очень хорошо объясняет, как это работает.
Таким образом, вы можете продолжить реализацию любой другой функции, которую они используют, в то же время, включая ваши.
Надеюсь, что это поможет.:)