Обнаружение браузера

Какой лучший/самый простой/самый точный способ обнаружения браузера пользователя?

Простота расширения и реализации - плюс.

Чем меньше технологий используется, тем лучше.

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

Решение может быть агматическим.

Решение будет использоваться только для целей отчетности.

Ответ 1

На сервере вы в значительной степени ограничены строкой UserAgent, предоставляемой браузером (что чревато проблемами, читайте о истории строк UserAgent).

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

Например, вы можете использовать setCapture, который предоставляет только MSIE:

if (element.setCapture) element.setCapture()

Вместо того, чтобы определять, что такое браузер, а затем выводить его возможности, мы просто видим, поддерживает ли он что-то перед его использованием - кто знает, какие браузеры будут поддерживать то, что в будущем, действительно ли вам нужно идти назад и обновите свои скрипты, если Safari решит поддерживать setCapture?

Ответ 2

JQuery Browser Plugin будет делать это на стороне клиента для вас.

Что такое плагин браузера jQuery?

JQuery Browser Plugin - это аддон для jQuery, который позволяет однозначно идентифицировать браузеры ваших посетителей.

Что он делает?

Он предоставляет вам объект в javascript, который содержит всю информацию о используемом браузере. Он также добавляет селектор CSS-браузера, что означает, что вы можете стилизовать элементы или писать функции для определенных браузеров, версий браузера, макетов, макетов и даже операционных систем. Изображение плагина jQuery Browser в действии.

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

alert($.browser.name);  // Alerts Firefox for me

Плагин будет работать так же эффективно, как и проверенные браузеры. В приведенном выше списке плагинов есть список браузеров, распознанных в нем, тесты, но всегда существует риск того, что новый браузер начнет пробираться (Google Chrome..), который потребует повторной записи правил распознавания. Тем не менее, этот плагин, похоже, регулярно обновляется.

Ответ 3

При использовании javascript: Не используйте обнаружение браузера

Напишите код, который проверяет себя на данные случаи, выставленные браузерами, иначе вы просто будете писать код для очень маленького населения. Лучше использовать "typeof foo == 'undefined'" и браузерные трюки, где они вам нужны.

jQuery делает это по всей своей кодовой базе (если вы посмотрите на код, вы увидите, как он реализует поведение для разных технологий браузера)

Лучше в долгосрочной перспективе.

Ответ 4

Так как я просто разместил это в вопросе (теперь удален), и он все еще находится в моем буфере пасты, я просто отправлю его. Примечание. Это серверное PHP-решение.

В настоящее время для этого используется следующий код. Это не очень утомительное решение, но должно быть легко реализовать больше браузеров. Я не знал о user-agents.org (спасибо PConroy), "на днях" я прокручу его и посмотрю, если я может обновить и добавить в мой список.

define("BROWSER_OPERA","Opera");
define("BROWSER_IE","IE");
define("BROWSER_OMNIWEB","Omniweb");
define("BROWSER_KONQUEROR","Konqueror");
define("BROWSER_SAFARI","Safari");
define("BROWSER_MOZILLA","Mozilla");
define("BROWSER_OTHER","other");

$aBrowsers = array
(
  array("regexp" => "@Opera(/| )([0-9].[0-9]{1,2})@", "browser" => BROWSER_OPERA, "index" => 2),
  array("regexp" => "@MSIE ([0-9].[0-9]{1,2})@", "browser" => BROWSER_IE, "index" => 1),
  array("regexp" => "@OmniWeb/([0-9].[0-9]{1,2})@", "browser" => BROWSER_OMNIWEB, "index" => 1),
  array("regexp" => "@(Konqueror/)(.*)(;)@", "browser" => BROWSER_KONQUEROR, "index" => 2),
  array("regexp" => "@Safari/([0-9]*)@", "browser" => BROWSER_SAFARI, "index" => 1),
  array("regexp" => "@Mozilla/([0-9].[0-9]{1,2})@", "browser" => BROWSER_MOZILLA, "index" => 1)
);

foreach($aBrowsers as $aBrowser)
{
  if (preg_match($aBrowser["regexp"], $_SERVER["HTTP_USER_AGENT"], $aBrowserVersion))
  {
    define("BROWSER_AGENT",$aBrowser["browser"]);
    define("BROWSER_VERSION",$aBrowserVersion[$aBrowser["index"]]);
    break;
  }
}

Ответ 5

как сказал Дэн: это зависит от используемой технологии.

Для обнаружения браузера на стороне сервера PHP я рекомендую обнаружение браузера Harald Hope:

http://techpatterns.com/downloads/php_browser_detection.php

Опубликовано в GPL.

Ответ 6

Не используйте обнаружение браузера:

  • Обнаружение браузера не на 100% надежнее в лучшие времена, но все становится хуже:
  • Существует множество вариантов браузеров (настройки MSIE и т.д.).
  • Браузеры могут лгать об их идентичности (у Opera действительно есть эта функция)
  • Шлюзы скрывают или обфускают идентификатор браузера
  • Специалисты по настройке и шлюзу пишут свой собственный мусор в USER_AGENT

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

Ответ 7

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

Я сделал следующее.

Я использую комбинацию JavaScript и PHP для записи статистики. JavaScript, чтобы определить, какой браузер и ОС (как это, вероятно, самый точный), и PHP для его записи:

JavaScript исходит из Quirksmode, PHP довольно очевиден. Я использую MooTools JS framework.

Добавьте к BrowserDetect следующее: script:

window.addEvent('domready', function() {
    if (BrowserDetect) {
        var q_data = 'ajax=true&browser=' + BrowserDetect.browser + '&version=' + BrowserDetect.version + '&os=' + BrowserDetect.OS;
        var query = 'record_browser.php'
        var req = new Request.JSON({url: query, onComplete: setSelectWithJSON, data: q_data}).post();
    }
});

Это определяет браузер, версию браузера и ОС пользовательского браузера и отправляет его в record_browser.php script. record_browser.php script просто добавьте эту информацию вместе с PHP session_id и текущей user_id, если она есть.

Таблица MySQL:

CREATE TABLE `browser_detects` (
  `id` int(11) NOT NULL auto_increment,
  `session` varchar(255) NOT NULL default '',
  `user_id` int(11) NOT NULL default '0',
  `browser` varchar(255) NOT NULL default '',
  `version` varchar(255) NOT NULL default '',
  `os` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `sessionUnique` (`session`)
)

Код PHP:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $session = session_id();
    $user_id = isset($user_id) ? $user_id ? 0;
    $browser = isset($_POST['browser']) ? $_POST['browser'] ? '';
    $version = isset($_POST['version']) ? $_POST['version'] ? '';
    $os = isset($_POST['os']) ? $_POST['os'] ? '';
    $q = $conn->prepare('INSERT INTO browser_detects (`session`, `user`, `browser`, `version`, `os`) VALUES (:session :user, :browser, :version, :os)');
    $q->execute(array(
                    ':session' => $session,
                    ':user' => $user_id,
                    ':browser' => $browser,
                    ':version' => $version,
                    ':os' => $os
                ));
}

Ответ 8

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

Это очень быстрый способ обнаружения IE.

<script>
  if('\v'=='v'){
    alert('I am IE');
  } else {
    alert('NOT IE');
  }
</script>

Его довольно аккуратно, потому что он выбирает IE, не отключаясь в Opera.

Бонусные баллы, если вы знаете , почему работает в IE.; -)

Ответ 9

Изменить. Решение ниже не рекомендуется. Попробуйте это вместо: http://whichbrowser.net/

Это когда-то работало для меня, но теперь, глядя на код, я понятия не имею, как это сделать. Используйте вместо этого: -/

<script type="text/javascript">
    // <![CDATA[
    var BrowserCheck = Class.create({
        initialize: function () {
            var userAgent = navigator.userAgent.toLowerCase();
            this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1];
            this.safari = /webkit/.test(userAgent) && !/chrome/.test(userAgent);
            this.opera = /opera/.test(userAgent);
            this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent);
            this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent);
            this.chrome = /chrome/.test(userAgent);
        }
    });    
    // ]]>
</script>

Не забывайте, что вам нужно инициализировать его, чтобы использовать его, поэтому поместите это в свой код:

var UserBrowser = new BrowserCheck();

И затем проверьте тип и версию браузера следующим образом: (например, Internet Explorer 8)

if ((UserBrowser.msie == true) && (UserBrowser.version == 8))

и др.

Надеюсь, что эта работа для вас такая, какая у нас есть, но помните, что никакое обнаружение браузера не является доказательством пули!

Ответ 10

Это код С#, который я использую, надеюсь, будет полезно.

StringBuilder strb = new StringBuilder();
strb.AppendFormat ( "User Agent: {0}{1}", Request.ServerVariables["http_user_agent"].ToString(), Environment.NewLine );
strb.AppendFormat ( "Browser: {0}{1}", Request.Browser.Browser.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Request.Browser.Version.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Major Version: {0}{1}", Request.Browser.MajorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Minor Version: {0}{1}", Request.Browser.MinorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Platform: {0}{1}", Request.Browser.Platform.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ECMA Script version: {0}{1}", Request.Browser.EcmaScriptVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Type: {0}{1}", Request.Browser.Type.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}",  Environment.NewLine );
strb.AppendFormat ( "ActiveX Controls: {0}{1}", Request.Browser.ActiveXControls.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Background Sounds: {0}{1}", Request.Browser.BackgroundSounds.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "AOL: {0}{1}", Request.Browser.AOL.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Beta: {0}{1}", Request.Browser.Beta.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "CDF: {0}{1}", Request.Browser.CDF.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ClrVersion: {0}{1}", Request.Browser.ClrVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Cookies: {0}{1}", Request.Browser.Cookies.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Crawler: {0}{1}", Request.Browser.Crawler.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Frames: {0}{1}", Request.Browser.Frames.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Tables: {0}{1}", Request.Browser.Tables.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaApplets: {0}{1}", Request.Browser.JavaApplets.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaScript: {0}{1}", Request.Browser.JavaScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "MSDomVersion: {0}{1}", Request.Browser.MSDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "TagWriter: {0}{1}", Request.Browser.TagWriter.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "VBScript: {0}{1}", Request.Browser.VBScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "W3CDomVersion: {0}{1}", Request.Browser.W3CDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win16: {0}{1}", Request.Browser.Win16.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win32: {0}{1}", Request.Browser.Win32.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}", Environment.NewLine );
strb.AppendFormat ( "MachineName: {0}{1}", Environment.MachineName, Environment.NewLine );
strb.AppendFormat ( "OSVersion: {0}{1}", Environment.OSVersion, Environment.NewLine );
strb.AppendFormat ( "ProcessorCount: {0}{1}", Environment.ProcessorCount, Environment.NewLine );
strb.AppendFormat ( "UserName: {0}{1}", Environment.UserName, Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Environment.Version, Environment.NewLine );
strb.AppendFormat ( "UserInteractive: {0}{1}", Environment.UserInteractive, Environment.NewLine );
strb.AppendFormat ( "UserDomainName: {0}{1}", Environment.UserDomainName, Environment.NewLine );

Ответ 11

Для Internet Explorer и таблиц стилей вы можете использовать следующий синтаксис:

<!--[if lte IE 6]><link href="/style.css" rel="stylesheet" type="text/css" /><![endif]-->

Это относится к IE 6 или ранее. Вы можете изменить версию IE, а также:

<!--[if eq IE 7]> = Equal too IE 7
<!--[if gt IE 6]> = Greater than IE 6

Не уверен, что это работает с другими частями страницы, но работает, если вы помещаете его в тег <head>. Смотрите пример для получения дополнительной информации

Ответ 12

Как правило, когда браузер делает запрос, он отправляет вам кучу информации (время, дата имени, пользовательский агент...). Вы должны попытаться просмотреть заголовки, отправленные клиентом, и перейти к тому, что говорит вам их браузер (я думаю, что это "User-Agent:".