Какая разница между обнаружением функции, выводом функции и использованием строки 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