2013-11-20 3 views
16

Меня задавали этот вопрос на собеседовании в последнее время, особенно вокруг Javascript. Мне было интересно, как правильно реагировать.В чем разница между обнаружением функции, выводом функции и использованием строки UA

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

+0

Все они могут быть легко просмотрены в Интернете, нет? Это должен быть первый шаг, и что неясно *, то * может сделать хороший вопрос переполнения стека. –

+0

Также так много ресурсов, когда обнаружение функции Google или агента пользователя, например [обнаружение браузера и обнаружение функции] (http://stackoverflow.com/q/1294586) –

ответ

33

Feature detection проверки признака для существования, например:

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

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

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

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

if (navigator.userAgent.indexOf("MSIE 7") > -1){ 
    //do something 
} 
5

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

if('localStorage' in window)

Feature умозаключение: если х существует, мы можем предположить, что у существует

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

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

1

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

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

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

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

Вы бы получить доступ к нему в JavaScript похож на:

navigator.userAgent