Каковы средства, преимущества и различия между обнаружением User Agent и Feature Detection? - PullRequest
4 голосов
/ 23 мая 2011

Каковы средства, преимущества и различия между обнаружением User Agent и Feature Detection?и какой из них лучше?

И, пожалуйста, приведите примеры использования для обоих.

Ответы [ 4 ]

6 голосов
/ 23 мая 2011

Основная причина использовать обнаружение функций в отличие от прослушивания пользовательского агента - это проверка будущего.

Скажем, например, что вы хотите использовать некоторые новые функции XMLHttpRequest 2.0 (просто придумав это).Вы знаете, что IE не поддерживает это, но Firefox поддерживает, и поэтому у вас есть такой код в вашем JS:

if (!IE) {
    UseNewAjax();
} else {
    UseOldAjax();
}

Позже выходит новая версия IE, которая поддерживает новые функции, но потому что вывы нюхаете агентов, ваши читатели IE не смогут получить эту функциональность без вашего изменения кода.

С другой стороны, если вы обнаружите функцию:

if (document.hasCoolNewAjax) {
    UseNewAjax();
} else {
    UseOldAjax();
}

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

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

Обнаружение функций : Использование языка программирования для определения того, поддерживает ли браузер определенную функцию.Считается лучшей практикой в ​​сообществе разработчиков, поскольку она надежна и рассчитана на будущее.

Из Википедии:

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

JavaScript - не единственный язык, на котором вы можете прослушивать пользовательский агент или определять функции.Например, .NET Framework имеет свойства, которые позволяют читать всевозможную информацию о браузере:

http://msdn.microsoft.com/en-us/library/3yekbd5b.aspx

http://modernizr.com

2 голосов
/ 23 мая 2011

Обнаружение функций всегда лучше, чем обнаружение пользовательских агентов, потому что пользователи могут подделать их строку пользовательского агента, поэтому это ненадежно.

1 голос
/ 23 мая 2011

Помимо других очень веских причин, приведенных в других ответах, вот код psuedo для примера другого вида:

 if (new_feature_available)
 {
    use_new_feature();
 }
 else
 {
    use_old_feature();
 }

VS:

// We had to look up what features are available in each to make this list
// There are probably browsers we're missing here as well...
// TODO: Make this list really big and include all known browsers
// TODO: Double check that this feature is not supported in listed browsers

 if (
         browser not IE5, IE6, IE7, Opera8, Firefox1.8, Seamonkey,
         OR browser is Chrome10, Firefox4, IE9
     )
 {
    use_new_feature();
 }
 else
 {
    use_old_feature();
 }

Видя это, разве функция обнаружения не имеет больше смысла?

0 голосов
/ 23 мая 2011

Обнаружение браузера ненадежно и его трудно поддерживать.

Это ненадежно, потому что:

  • Подмена пользовательского агента может превратить iPad в настольный ПК с IE6 и наоборот
  • связь между версией агента пользователя / версией ОС / версией движка JS очень мала, если не полностью отсутствует

Сложно поддерживать, потому что:

  • пользовательские агенты постоянно развиваются, заставляя вас разбирать и разбирать
  • ваш код тесно связан с конкретными браузерами / движком, что вызывает множество компромиссов и обходных путей
  • ваш код в основном основан на предположениях и, следовательноочень хрупкий

Функция обнаружения делает код проще и чище.Указанный код - в некотором роде - абстрагирован от браузеров и почти полностью ориентирован на будущее.

...