Почему сниффинг браузера не рекомендуется?

Вы слышите это повсюду: использование javascript для прослушивания строки пользовательского агента для определения версий браузера — очень плохая вещь. Последняя версия jQuery объявила устаревшим свой объект $.browser вместо $.support. Но что мне делать, если есть ошибка или проблема, которая влияет только на IE, а не на другие браузеры, и я не знаю, почему?

В моем случае некоторый код jQuery заставляет всплывающую подсказку появляться и исчезать с анимацией при наведении и выходе из мыши. В Internet Explorer это выглядит ужасно и нервно, с подсказкой div, которая изменяется до очень большого размера, прежде чем скрыться, и если вы наведете указатель мыши на кучу элементов кончиком, это действительно убьет браузер. Я понятия не имею, какую конкретную функцию IE не «поддерживает», которую я должен тестировать, поэтому гораздо проще просто понюхать IE и использовать другой метод. Что я мог/должен сделать вместо этого?


person nickf    schedule 19.03.2009    source источник
comment
Вы могли бы опубликовать дополнительную информацию о вашей конкретной проблеме...   -  person markt    schedule 19.03.2009
comment
Для IE вы можете использовать условные комментарии, функция, поддерживаемая только MSIE: msdn.microsoft .com/en-us/library/ms537512.aspx   -  person some    schedule 19.03.2009
comment
@markt: меня не столько интересует решение этой конкретной проблемы, сколько общая проблема обнюхивания браузера. @some: разве это не так плохо?   -  person nickf    schedule 20.03.2009
comment
ИМХО нет. Firefox, Opera и Chrome обычно ведут себя достаточно похоже. Но чтобы заставить его работать в IE, вам иногда нужны разные html/css/javascript. Прелесть условных комментариев в том, что можно легко получить настоящий (не поддельный) IE, чтобы получить специальный код. Вы даже можете нацелить его на конкретную версию IE или платформу IIRC.   -  person some    schedule 11.06.2009
comment
Это то, что вы можете найти интересным. Точно так же, как комиксы Дилберта, я знаю, что нашел это забавным… и как-то удручающим.   -  person Bryan    schedule 21.07.2009
comment
Обнаружение в браузере считается как хорошая практика. В Windows я использую компактный инспектор с fiddler, чтобы определить, использует ли скрипт, запущенный на веб-сайте, сниффинг браузера.   -  person Annie    schedule 28.11.2012


Ответы (7)


Потому что простое прослушивание пользовательского агента (что делает jquery для заполнения объекта $.browser) не говорит вам всей правды.

Строка пользовательского агента может быть легко изменена во многих браузерах, поэтому, если вы, например, отключите некоторые функции, которые не работают в IE, у всех, кто похоже использует IE, вы можете случайно отключить эти функции из некоторые будущие браузеры или пользователи, которые просто по какой-то причине (например, чтобы обойти ограничения, основанные на анализе браузера) притворяются, что используют IE.

Это может показаться не слишком большой проблемой, но это все же плохая практика.

И да, я тоже сниффер IE. я использую

$.browser.msie && document.all

просто чтобы убедиться.

person kkyy    schedule 19.03.2009
comment
С какой стати кому-то притворяться IE? ха-ха - person alex; 19.03.2009
comment
Что ж, одним из хороших примеров может быть использование сайтов, которые пользовательский браузер обнюхивает и запрещает доступ пользователям, не являющимся пользователями IE :) - person kkyy; 19.03.2009
comment
О, да, раньше так было с моим сайтом онлайн-банкинга. Это откажет Firefox. К счастью, это было прояснено в течение некоторого времени. - person alex; 19.03.2009

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

Таким образом, проблема не в просмотре строки пользовательского агента, а в том, чтобы решить, что должен делать ваш сайт, основываясь на том, что вы думаете о браузере. Это означает, что вы можете неизбежно ограничить или сломать свой сайт в будущем; Например, я видел несколько демонстраций холста, которые блокируют IE. Они не проверяют, поддерживается ли канвас, они явно ищут IE, и если они видят его, они говорят, что IE не работает, это означает, что даже если бы IE в конечном итоге поддерживал канвас, эти сайты все равно не работали бы.

Вместо того, чтобы нюхать браузер, вы всегда должны пытаться обнаружить интересующую вас функцию или ошибку. Наиболее распространенным примером этих тестов является «обнаружение объекта», например. document.createElement("canvas").getContext - это то, как должно определяться существование холста, и он будет правильно подхватывать холст в любом браузере, даже если текущие версии его не поддерживают.

person olliej    schedule 19.03.2009

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

Было бы лучше, если бы каждый браузер придерживался схемы идентификации себя «имя/версия», но это не так. Большинство браузеров утверждают, что они «Mozilla/some.version», независимо от того, что они собой представляют. И этот бит в начале — единственная легко анализируемая часть строки; остальное совершенно нестандартно. Поэтому скрипты начали искать во всей строке подстроки характеристик, такие как «MSIE». Это катастрофа.

  • Некоторые браузеры преднамеренно подменяют друг друга, включая такие подстроки, как «MSIE», «Gecko» и «Safari», в строки своих пользовательских агентов, когда они не являются этими браузерами, в основном для того, чтобы победить непродуманные анализаторы строк.

  • Некоторые браузеры позволяют подделывать всю строку пользовательского агента под контролем пользователя.

  • Некоторые варианты браузера не являются. Например, IE Mobile совсем не похож на обычный IE, но «MSIE» все равно будет ему соответствовать.

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

  • Сопоставление строк по своей сути ненадежно. Например, новый браузер под названием «CLUMSIERbrowser» будет соответствовать MSIE.

person bobince    schedule 19.03.2009

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

Я часто нахожу это полезным. Я знаю, что IE6 не поддерживает альфа-прозрачность, поэтому я использую сниффинг браузера, чтобы обнаружить IE6 и скрыть/изменить элементы, которые их используют.

Кроме того, для быстрого многократного перемещения мыши попробуйте HoverIntent. Я считаю, что пользователи setTimeout() запускают события только тогда, когда мышь находится над элементом в течение короткого периода времени, экономя циклы и избегая очереди событий и потенциально зависая браузер.

Лично я предпочел jQuery с методами версии/типа браузера. Его можно использовать для отображения дружественного приветственного сообщения в зависимости от браузера. Возможно, jQuery устарела из-за давления, что «обнюхивание браузера — это зло».

Обновлять

Вот что говорит Джон Резиг (создатель jQuery):

Мы сохраняем jQuery.browser в обозримом будущем, но хотим, чтобы разработчики отказались от его использования — и лучший способ заставить разработчиков сделать это — стать хорошим примером правильных шаблонов разработки.

Для ясности: точки, включенные в $.support, в основном связаны с ошибками браузера (ошибки IE, которые нельзя протестировать с помощью обычного обнаружения объектов) - и они не охватывают все возможные ошибки (всего около дюжины или около того). Ожидается, что в будущем другие разработчики добавят свои собственные точки тестирования.

Кроме того, в этом коммите я забыл загрузить файл support.js — его можно найти здесь: http://dev.jquery.com/browser/trunk/jquery/src/support.js?rev.=5986

Источник: http://www.reddit.com/r/programming/comments/7l2mr/jquery_removes_all_browser_sniffing/

См. также: http://dev.jquery.com/changeset/5985

person alex    schedule 19.03.2009
comment
Также обратите внимание, что Mozilla в строках агента пользователя восходит к тем временам, когда Mozilla (Mosaic Killer) был лучшим браузером, и конкуренты хотели подражать ему. - person alex; 19.03.2009

Я использую комбинацию вещей, которые я изучил из шаблона HTML5 и jquery, поэтому использую условные комментарии IE для определения версии IE, а затем проверяю существование этих классов. Поэтому HTML будет иметь это вверху:

<!--[if lt IE 7 ]> <html class="no-js ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]>    <html class="no-js ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]>    <html class="no-js ie8" lang="en"> <![endif]-->
<!--[if IE 9 ]>    <html class="no-js ie9" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--> <html class="no-js" lang="en"> <!--<![endif]-->

Затем я бы проверил наличие .ie6, .ie7 и т. д. в jquery следующим образом:

if($('.ie6, .ie7').length > 0){
    // your conditional stuff here
}

Хорошо работает для меня.

ПРИМЕЧАНИЕ. Очевидно, что это тестирует только версии IE, но большинство других браузеров не вызывают проблем, которые IE всегда вызывает в наши дни, и это намного безопаснее, чем тестирование пользовательского агента!

person Matthew    schedule 19.01.2012
comment
Да, но, как я уже сказал в комментариях к ОП, эти условные комментарии на самом деле являются просто еще одной формой обнюхивания браузера. Да, они более надежны, поскольку пользователь не может возиться с ними, как со строкой пользовательского агента, но они определенно не выполняют тесты функций, как вы должны делать. - person nickf; 20.01.2012

Это не рекомендуется, потому что браузеры лгут о том, кто они такие. См. http://farukat.es/journal/2011/02/499-lest-we-forget-or-how-i-learned-whats-so-bad-about-browser-sniffing ( статью автора библиотеки modernizr).

Кроме того, он по своей сути не рассчитан на будущее. Из статьи:

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

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

person jinglesthula    schedule 14.08.2013
comment
Самый чистый ясный ответ. Браузеры лгут о том, кто они, и меняют код. - person AnthonyVO; 28.08.2019

Вынюхивайте функции, а не юзерагенты. Псевдокод:

if (browser.supports('feature')){
    //execute feature
}

else{
    //fallback
}
person user2019515    schedule 12.11.2013
comment
Если кто-то может объяснить мне, почему за это проголосовали, это было бы здорово. makeameme.org/media/templates/250/ - person user2019515; 16.11.2013
comment
Я думаю, что вы не объясняете, почему лучше обнюхивать функции, поэтому вы не пытаетесь ответить на заданный вопрос. (но я не минусовал вас, поэтому не уверен) - person eloyesp; 26.12.2013