Какая разница между обнаружением функции, выводом функции и использованием строки UA
Меня задали этот вопрос на собеседовании в последнее время, особенно вокруг Javascript. Я задавался вопросом о правильном ответе.
В чем же разница между feature detection
, feature inference
и использованием строки User agent
?
Ответы
Ответ 1
Обнаружение функции проверяет функцию для существования, например:
if (window.XMLHttpRequest) {
new XMLHttpRequest();
}
Функция inference проверяет наличие функции, как и функцию обнаружения, но использует другую функцию, поскольку предполагает, что она также будет существовать, например:
if (document.getElementsByTagName) {
element = document.getElementById(id);
}
Проверка строка UA является старой практикой и больше не должна использоваться. Вы продолжаете изменять проверки UA и никогда не извлекаете пользу из недавно реализованных функций, например:
if (navigator.userAgent.indexOf("MSIE 7") > -1){
//do something
}
Ответ 2
Обнаружение функции: на самом деле проверка наличия этой функции
if('localStorage' in window)
Вывод функции: если x существует, мы можем предположить, что y существует
if('localStorage' in window){
window.sessionStorage.setItem("this-should-exist-too", 1);
}
Если вы полагаетесь на пользовательский агент, тогда вам придется иметь карту, в которой браузер X поддерживает функцию Y
Ответ 3
Функция обнаружения пытается определить, существует ли функция. Например, если браузер пользователя поддерживает LocalStorage или API геолокации.
if (navigator.geolocation) {
// geolocation possible.. do some stuff
}
Вывод функции предполагает, что, поскольку вы обнаружили одну функцию, которую вы можете использовать другие функции. Например, если вы обнаружите API геолокации, возможно, вы предполагаете, что ваш пользователь находится в современном браузере, и теперь теперь доступен LocalStorage. Обычно плохо предположить, поэтому вам гораздо лучше использовать функцию обнаружения функций для каждой функции, которую вы хотите использовать, и иметь стратегию резервного копирования в случае, если функция недоступна. Даже если у пользователя есть современный браузер с геолокацией, это не значит, что они позволят вашему приложению использовать его, поэтому планируйте его соответствующим образом.
Строка агента пользователя просто читает туповатую маленькую строку, которую отправляет каждый браузер, а затем вы можете сравнить эту строку с некоторыми известными браузерами, на которые вы нацеливаете. Как правило, это очень старый способ делать вещи и легко подделываться, поэтому у вас должна быть очень конкретная причина, чтобы идти по этому маршруту (может быть, в среде тестирования нагрузки или что-то еще). Смотрите wiki по теме http://en.wikipedia.org/wiki/User_agent
Вы бы получили доступ к нему в javascript, подобном:
navigator.userAgent