В чем разница между обнаружением функций, выводом функций и использованием строки UA

Недавно мне задали этот вопрос на собеседовании, особенно в отношении Javascript. Меня интересовал правильный ответ.

В чем именно разница между feature detection, feature inference и использованием строки User agent?


person professormeowingtons    schedule 20.11.2013    source источник
comment
Все это можно легко найти в Интернете, не так ли? Это должно быть первым шагом, и то, что неясно тогда, может стать хорошим вопросом о переполнении стека.   -  person Pekka    schedule 20.11.2013
comment
Также так много ресурсов при поиске в Google feature detection vs. user agent, таких как обнаружение браузера и обнаружение функций   -  person Pekka    schedule 20.11.2013


Ответы (3)


Обнаружение функций проверяет наличие функции, например:

if (window.XMLHttpRequest) {
    new XMLHttpRequest();
}

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

if (document.getElementsByTagName) {
    element = document.getElementById(id);
}

Проверка строки UA является старой практикой, и ее больше не следует использовать. Вы продолжаете изменять проверки UA и никогда не пользуетесь новыми реализованными функциями, например:

if (navigator.userAgent.indexOf("MSIE 7") > -1){
    //do something
}
person R. Oosterholt    schedule 20.11.2013

Обнаружение функции: фактическая проверка существования функции

if('localStorage' in window)

Вывод признаков: если x существует, мы можем предположить, что существует y

if('localStorage' in window){
   window.sessionStorage.setItem("this-should-exist-too", 1);
}

Если вы полагаетесь на пользовательский агент, вам понадобится карта, в которой браузер X поддерживает функцию Y.

person Rob M.    schedule 20.11.2013

Обнаружение функции пытается определить, существует ли функция. Например, если браузер пользователя поддерживает LocalStorage или API геолокации.

if (navigator.geolocation) { 
    // geolocation possible.. do some stuff
}

Вывод функции предполагает, что поскольку вы обнаружили одну функцию, вы можете использовать другие функции. Например, если вы обнаружите API геолокации, возможно, вы предположите, что ваш пользователь использует современный браузер, и поэтому теперь доступно LocalStorage. Обычно плохо предполагать, поэтому гораздо лучше просто использовать обнаружение функций для каждой функции, которую вы хотите использовать, и иметь запасную стратегию на случай, если функция недоступна. Даже если у пользователя есть современный браузер с геолокацией, это не значит, что он позволит вашему приложению использовать его, поэтому планируйте его соответствующим образом.

Строка пользовательского агента просто читает глупую маленькую строку, которую отправляет каждый браузер, а затем вы можете сравнить эту строку с некоторыми известными браузерами, на которые вы ориентируетесь. Как правило, это очень старый способ ведения дел, и его легко подделать, поэтому у вас должна быть очень конкретная причина, чтобы пойти по этому пути (возможно, в среде нагрузочного тестирования или что-то в этом роде). См. вики по теме http://en.wikipedia.org/wiki/User_agent.

Вы получите к нему доступ в javascript, подобном:

navigator.userAgent
person Mike Pugh    schedule 20.11.2013