Обнюхивание браузера

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

Я хочу предложить пользователю возможность установить сайт как веб-приложение, если браузер Google Chrome или Firefox 4+, как виджет, если это Opera, как расширение, если это Safari... и так далее.

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

Итак, как мне сделать это по-хорошему?

Я нашел это на основе функций, а не пользовательского агента

Безопасный функциональный способ обнаружения Google Chrome с помощью Javascript?

var is = {
  ff: window.globalStorage,
  ie: document.all && !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStyle && !window.globalStorage && !window.opera
}

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


person Stofke    schedule 26.05.2011    source источник
comment
is.safari == true в Chrome (или мне нужно обновить Chrome).   -  person Lee Kowalkowski    schedule 26.05.2011
comment
Почему вы хотите быть защищенным от подделок? Вы действительно думали об этом? Почему люди подделывают? Я никогда не нуждался в этом, но если кто-то захочет загрузить ваш виджет Opera в Firefox, пусть загрузит, у него могут быть законные причины. Я не думаю, что спуферы будут жаловаться, если что-то не работает, что на самом деле является их собственной работой.   -  person Lee Kowalkowski    schedule 26.05.2011
comment
В этом фрагменте кода есть несколько ошибок. Не могли бы вы быть более явным? На какие версии браузера вы хотите настроить таргетинг?   -  person Knu    schedule 28.05.2011
comment
Opera, Safari, Firefox, Chrome (последние версии для всех)   -  person Stofke    schedule 31.05.2011
comment
В следующий раз используйте @knu, я бы ответил на ваш вопрос.   -  person Knu    schedule 05.06.2011


Ответы (4)


Взгляните на jQuery.browser: http://api.jquery.com/jQuery.browser/

Свойство $.browser предоставляет информацию о веб-браузере, обращающемся к странице, как сообщает сам браузер. Он содержит флаги для каждого из четырех наиболее распространенных классов браузеров (Internet Explorer, Mozilla, Webkit и Opera), а также информацию о версии.

Доступные флаги:

webkit (начиная с jQuery 1.4) safari (устарело) opera msie mozilla Это свойство доступно сразу. Поэтому безопасно использовать его, чтобы определить, следует ли вызывать $(document).ready(). Свойство $.browser устарело в jQuery 1.3, и его функциональность может быть перенесена в подключаемый модуль, поддерживаемый командой, в будущем выпуске jQuery.

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

person tofutim    schedule 26.05.2011
comment
Хорошо, так как я уже использую Jquery, но он уязвим для спуфинга - person Stofke; 26.05.2011

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

person jcomeau_ictx    schedule 26.05.2011
comment
Вот что я имел в виду под хорошим ;-) Что-то, что работает и рассчитано на будущее. - person Stofke; 26.05.2011
comment
вы правы, некоторые функции могут поддерживаться другими браузерами, что также делает решение, основанное на функциях, ненадежным. Но это лучшее, что я могу придумать на данный момент - person Stofke; 26.05.2011

Я никогда не понимал проблемы с использованием только свойств объекта навигатора:

<script>
    for(var item in navigator)
    {
        document.write('navigator.' + item + ': ' + navigator[item] + '<br>');
    }
</script>

Они говорят, что navigator.userAgent ненадежен, но проведите исследование, я считаю, что его можно комбинировать с navigator.appName и navigator.vendor с высокой надежностью.


ОБНОВЛЕНИЕ: март 2013 г.

Вы должны проверить непосредственно то, что хотите узнать, если вы попытаетесь сделать вывод, вы сделаете это неправильно.

Например. Если вы хотите использовать функцию, протестируйте ее напрямую, не предполагайте, что если document.all, то вы можете использовать document.uniqueID. Тест на document.uniqueID напрямую.

Все знают, что использовать navigator.userAgent для определения возможности использования window.localStorage — безумие, но они не понимают, что ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera делает то же самое в противоположном направлении.

Если вы действительно хотите знать, что такое пользовательский агент, то, к сожалению, все, что вы можете сделать, это это объект navigator.

Подмена строки пользовательского агента — это не проблема, во всяком случае не ваша.

person Lee Kowalkowski    schedule 26.05.2011
comment
Ну, это можно подделать, и это одна из причин, почему это ненадежно. - person Stofke; 26.05.2011
comment
@Stofke: Все можно подделать. Вам просто нужен приличный шестнадцатеричный редактор, и все готово. Все ваши механизмы обнаружения могут быть сломаны. Мой совет — не беспокоиться о меньшинстве в данном случае. - person Lee Kowalkowski; 26.05.2011
comment
Методы, указанные в настоящее время в самом вопросе, поддаются ли они вмешательству? Я имею в виду, что они не зависят от пользовательского агента или чего-то еще, они зависят от встроенных функций, поддерживаемых конкретными браузерами. Как их можно подделать? - person SexyBeast; 05.03.2013
comment
@Cupidvogel: Хорошо, давайте проигнорируем тот факт, что поддержка встроенных функций браузера может быть изменена. Возьмем window.globalStorage в качестве примера. Можно было бы написать расширение для браузера, определяющее это для всех страниц в любом браузере, поэтому, если определено window.globalStorage, это не обязательно гарантирует, что браузером является Firefox. - person Lee Kowalkowski; 06.03.2013
comment
Какой? Пользователь может добавлять расширения JS на все страницы своего браузера? Это страшно! - person SexyBeast; 06.03.2013

Вы можете попробовать: BrowserHawk, (http://www.cyscape.com/showbrow.asp) Что браузер проверяет на стороне сервера. Это теоретически уменьшит обработку на стороне браузера при определении того, что показывать конечным пользователям. Однако я не думаю, что это бесплатно. Их рекомендуемые клиенты включают Yahoo, AOL, Cisco, Microsoft и Sun. Таким образом, это предназначено только для производственного использования с большими ожиданиями конечных пользователей, посещающих сайт.

person mel3kings    schedule 18.06.2013