Почему браузер не обнюхивает не рекомендуемую практику?
Вы слышите это повсюду: используя javascript, чтобы обнюхать строку пользовательского агента для обнаружения версий браузера, это очень плохое. Последняя версия jQuery теперь устарела вместо $.browser
объекта $.browser
вместо $.support
. Но что мне делать, если есть ошибка или проблема, которая влияет только на IE, а не на другие браузеры, и я не уверен, почему?
В моем случае некоторый код jQuery вызывает всплывающую подсказку и исчезает с анимацией при наведении курсора мыши и мыши. В Internet Explorer это выглядит ужасно и неудобно, когда div tooltip меняется на действительно большой размер, прежде чем скрываться, и если вы нажмете на кучу предметов с подсказкой, это действительно убивает браузер. Я понятия не имею, какая особенность IE не поддерживает, с которой я должен тестировать, поэтому гораздо проще просто нюхать IE и использовать другой метод. Что мне делать/следует делать?
Ответы
Ответ 1
Потому что просто обнюхивание пользовательского агента (что и делает jquery для заполнения объекта $.browser) не говорит вам всей правды.
Строку пользовательского агента можно легко изменить во многих браузерах, поэтому, если вы, например, отключите некоторые функции, которые не работают в IE от всех, кто, кажется, использует IE, вы можете случайно отключить эти функции от некоторых будущих браузеров или пользователи, которые по какой-то причине (например, чтобы обойти ограничения, основанные на обнюхивании браузером), притворяются, что используют IE.
Это может показаться не слишком большой проблемой, но это еще плохая практика.
И да, я тоже сниффер IE. Я использую
$.browser.msie && document.all
чтобы быть уверенным.
Ответ 2
Это первое, что нужно отметить, это то, что обнюхивание пользовательского агента не просто означает поиск navigator.userAgent
, это общий термин для описания большого массива методов, которые люди используют для изменения поведения на основе того, что, по их мнению, является браузером.
Таким образом, проблема не связана с строкой пользовательского агента, проблема заключается в том, чтобы решить, что ваш сайт должен делать на основе того, что, по вашему мнению, является браузером. Это означает, что вы неизбежно можете ограничить или разбить свой сайт в будущем; Например, я видел несколько демонстраций холста, которые блокируют IE. Они не проверяют, поддерживается ли холст, они явно ищут IE, и если они видят это, говорят, что IE сломан, это означает, что даже если IE в конечном итоге поддерживает холст, эти сайты все равно не будут работать.
Вместо того, чтобы обнюхивать браузер, вы всегда должны пытаться обнаружить интересующую вас функцию или ошибку. Наиболее распространенным примером этих тестов является "обнаружение объекта", например. document.createElement("canvas").getContext
заключается в том, как следует обнаруживать существование холста и правильно отображать холст в любом браузере, даже если текущие версии его не поддерживают.
Ответ 3
Как и проблемы, связанные с обнюхиванием браузеров, уступающие способности к обнюхиванию, обработка navigator.userAgent как строки сама по себе является очень ненадежным способом обмана браузером.
Это может сработать лучше, если каждый браузер придерживается схемы "Название/версия" для идентификации себя, но они этого не делают. Большинство браузеров утверждают, что они являются "Mozilla/some.version", независимо от того, что они собой представляют. И этот бит в начале является единственной легко анализируемой частью строки; остальное совершенно нестандартно. Таким образом, скрипты начали поиск всей строки для символов подстроки типа "MSIE" . Это катастрофа.
-
Некоторые браузеры намеренно обманывают друг друга, включая подстроки, такие как "MSIE" , "Gecko" и "Safari" в своих строках пользовательского агента, когда они не являются теми браузерами, в основном для того, чтобы победить плохо продуманные струнные снифферы.
-
Некоторые браузеры позволяют подстроить всю строку пользовательского агента под управлением пользователя.
-
В некоторых вариантах браузера нет. Например, IE Mobile не имеет ничего общего с обычным IE, но "MSIE" по-прежнему будет соответствовать ему.
-
Некоторые браузеры позволяют надстройкам писать дополнительные токены в строку пользовательского агента, включая произвольный текст. Только одно изменение реестра приложением-изгоем может сделать MSIE похожим на Firefox.
-
Совпадение строк просто ненадёжно. Например, новый браузер под названием "CLUMSIERbrowser" будет соответствовать MSIE.
Ответ 4
Потому что, если вы ошибетесь, вы можете случайно отключить функции для будущих браузеров, которые их поддерживают.
Я часто считаю это полезным. Я знаю, что IE6 не поддерживает альфа-прозрачность, поэтому я использую обнюхивание браузера для обнаружения IE6 и скрытия/изменения элементов, которые их используют.
Кроме того, чтобы быстро запустить мышь многократно, попробуйте HoverIntent. Это пользователи setTimeout(), которые, как я полагаю, только запускают события, когда мышь была над элементом в течение короткого периода времени, экономя циклы и избегая очередности событий и потенциально замораживая браузер.
Лично я предпочитал jQuery с помощью методов браузера/типа. Его можно использовать для отображения приветственного приветствия на основе браузера. Возможно, jQuery осудил это из-за давления, что "обнюхивание браузером зла".
Update
Вот что говорит Джон Ресиг (создатель 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
Ответ 5
Я использую комбинацию вещей, которые я узнал из шаблона 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 всегда делает в наши дни, и это намного безопаснее, чем тестирование пользовательского агента!
Ответ 6
Не рекомендуется, потому что браузеры лгут о том, кто они. См. http://farukat.es/journal/2011/02/499-lest-we-forget-or-how-i-learned-whats-so-bad-about-browser-sniffing (статья автора библиотеки modernizr).
Кроме того, он по своей сути не является будущим. Из статьи:
Обнюхивание браузером - это метод, в котором вы делаете предположения о как часть кода будет работать в будущем. Как правило, это означает сделав предположение, что определенная ошибка браузера всегда будет там - что часто приводит к нарушению кода, когда браузеры вносят изменения и исправляют ошибки.
Обнаружение функции рекомендуется, так как оно намного проще, делает более четкое намерение в коде и избегает проблемы полностью из браузеров, лежащих о том, кто они.
Ответ 7
Снифф для функций, а не для пользовательских. Псевдокод:
if (browser.supports('feature')){
//execute feature
}
else{
//fallback
}