2010-06-03 3 views
2

Меня интересует, было ли это лучшим местом для обнаружения пользовательского агента клиента, клиентской стороны (javascript) или серверной стороны? Я поднял вопрос из-за того, что некоторые пользователи IE8 получают сообщение о том, что они используют IE6.Каков наилучший способ обнаружения пользовательского агента клиента?

+0

тангенциально Родственное примечание: Агент пользователя говорит MSIE 7.0 вместо MSIE 8.0 при использовании в режиме совместимости IE8. – Brian

ответ

8

Короткий и правильный ответ: не используйте ничего, что полагается на обнюхивание UserAgent.

Для надежной настройки путей кода вы должны проверить конкретную «вещь», для которой скопирована скобка, в первую очередь функции. Это называется Feature Detection.

Итак, если функция X поддерживается, мы делаем это, если не делаем этого.

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

if (isIE8) { 
    // use new feature provided by IE8 
} else if (isIE7) { 
    // use not so new feature provided by IE7 (and IE8) 
} else { 
    // use fallback for all others (which also works in IE7 and IE8) 
} 

Что вы думаете, что происходит, когда IE9 приходит?

Правильный шаблон в этом случае будет

if ("addEventListener" in foo) { 
    // use DOM level 2 addEventListener to attach events 
    foo.addEventListener(... 
} else if ("attachEvent" in foo) { 
    // use IE's proprietary attachEvent method 
    foo.attachEvent(... 
} else { 
    // fall back to DOM 0 
    foo["on" + eventName] = .... 
} 
+0

Тогда какой был бы лучший способ решить эту проблему? – westoque

+2

em .. удалить? Код должен использовать функцию Detection, а не UserAgent Sniffing для адаптации своих кодовых файлов –

+0

+1. Шон абсолютно прав. Статья Петра Мишо об обнаружении признаков - это хорошее место для начала: http://michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting –

5

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

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

+0

+1 для использования условных комментариев для обнаружения версии IE. – Brian

0

Информация найдено через клиент или обнаружения на стороне сервера, в основном то же самое.

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

0

я не знаю, как вы проверяете для агента пользователя, но я бы сделал так:

<%= 
case request.env['HTTP_USER_AGENT'] 
when /Safari/ 
    "it's a Mac!" 
when /iPhone/ 
    "it's a iPhone" 
else 
    "i don't know :(" 
end 
%> 

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

0

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

Смежные вопросы