лучший способ обнаружить браузер в js

Существует множество способов обнаружения браузера в JavaScript.

Насколько я знаю, использование navigator.userAgent или обнаружение функций (например, XMLHttpRequest) и так далее.

Может ли кто-нибудь сказать мне, какой способ является лучшим и наиболее эффективным?


person vikingmute    schedule 09.10.2011    source источник
comment
Для обнаружения функций используйте modernizr.com.   -  person Idered    schedule 09.10.2011


Ответы (4)


Если вам действительно нужно знать, какой браузер они используют, вам в основном нужно смотреть на строку userAgent (хотя иногда вы можете сделать вывод о браузере, взглянув на пару непонятные черты). Просто имейте в виду, что некоторые браузеры позволяют пользователю изменить это и обмануть вас. :-)

Но определение браузера не в моде по уважительным причинам. Вместо этого, как вы говорите, вы хотите обнаружить функции, которые вы ищете. Это надежнее и меньше работы. То, что IE не поддерживал, например, addEventListener, не означает, что он никогда не будет (и на самом деле IE9 поддерживает). Таким образом, вместо этого вы выполняете обнаружение функций, что защищает код в будущем.

Вот конкретный пример: предположим, вы хотите знать (как я сделал для моего плагина jQuery для place5) поддерживает ли браузер placeholder атрибут. Вы можете использовать обнаружение браузера и вести список браузеров, в которых версии поддерживаются или не поддерживаются, что беспорядочно и к чему вам нужно постоянно возвращаться, и т. д., и т. д., или вы можете сделать это:

if ("placeholder" in document.createElement("input")) {
    // The browser supports the attribute
}
else {
    // It doesn't
}

...и вы сделали.

На этой странице есть отличный набор функциональных тестов, поддерживаемых кангакс. Существует также библиотека под названием Modernizr, которая выполняет функции обнаружения, мультимедийные запросы и многое другое. Если вы используете jQuery, в него встроено определение некоторых функций через jQuery.support. В этой статьи.

person T.J. Crowder    schedule 09.10.2011
comment
ТОЛЬКО то, что мне было нужно! обнаружить IE9 и ниже. - person vsync; 16.01.2013
comment
@Т.Дж. Crowder. Согласен с выбором функции обнаружения вместо этого, но что, если вы пытаетесь обнаружить браузер, чтобы обойти ошибку? Ошибка, которую вы не можете проверить, или это приведет к зависанию браузера? - person johntrepreneur; 14.08.2013
comment
@Т.Дж. Crowder - помимо моего предыдущего вопроса, мне нужно найти браузеры от IE9 до IE7, и хорошим законным способом сделать это (на основе ваших комментариев об обнаружении функций) будет использование условных комментариев (поддерживаемых до IE9), которые устанавливают переменную. Верно? - person johntrepreneur; 14.08.2013
comment
@johntrepreneur: Если это единственный способ сделать то, что вы пытаетесь сделать, то почему бы и нет? Но загляните на страницу kangax и тому подобное. Есть есть вещи, которые вы действительно не можете обнаружить, но их не так много, как я предполагал... :-) - person T.J. Crowder; 14.08.2013
comment
Есть случаи, когда вам нужно обнаружить браузер. Например, я работаю над сайтом, который использует webGL, поэтому мы определяем, доступен ли он. Если это не так, мне нужно предоставить конкретное сообщение для браузера (в частности, набор инструкций для включения webGL в Safari). - person Max Strater; 12.08.2014

Вы не определяете браузеры. Вместо этого вы проверяете доступные функции.

Обнаружение браузера можно обойти (черт возьми. Мне пришлось сделать это самому при использовании Opera на Gmail несколько лет назад), но если в браузере есть функция, то вы знаете, что можете ее использовать.

person tereško    schedule 09.10.2011
comment
В некоторых случаях вам нужно знать конкретный браузер, чтобы вы могли, например, предоставить сообщение для конкретного браузера. - person Max Strater; 12.08.2014
comment
Ну, в моем случае инструкция по включению webGL в Safari. - person Max Strater; 12.08.2014
comment
То есть определить функциональность webGL, если ее нет, отобразить сообщение для конкретного браузера (обновите IE, вот как включить webGL и т. д.) - person Max Strater; 12.08.2014

Вы можете попробовать это http://www.quirksmode.org/js/detect.html.

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

Еще один отличный инструмент для обнаружения признаков — Modernizr.

person Epeli    schedule 09.10.2011

Обнаружение функций — это короткий путь к обнаружению браузера. Как уже упоминалось, более важно знать, поддерживается функция вашим браузером или нет, а не определять браузер. Следующая ссылка поможет вам различать браузеры в зависимости от поддерживаемых ими объектов: http://www.javascriptkit.com/javatutors/objdetect3.shtml

Однако, если вы хотите определить браузер только для того, чтобы знать, лучше использовать Navigator, а не проверять различные функции, проверяя условия.

person Seth23    schedule 09.10.2011