Вопрос

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

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

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

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

Решение может быть независимым от платформы.

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

Это было полезно?

Решение

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

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

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

if (element.setCapture) element.setCapture()

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

Другие советы

А Плагин JQuery для браузера сделает это на стороне клиента за вас.

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

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

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

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

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

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

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

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

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

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

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

Поскольку я только что опубликовал это в (теперь удаленном вопросе), и оно все еще находится в моем буфере вставки, я просто опубликую его повторно.Примечание:это серверное 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;
  }
}

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

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

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

Опубликовано под лицензией GPL.

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

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

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

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

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

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

JavaScript взят из Причудливый режим, PHP довольно очевиден.Я использую MooИнструменты JS-фреймворк.

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

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 сценарий.А record_browser.php скрипт просто добавляет информацию вместе с 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
                ));
}

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

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

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

На самом деле это довольно удобно, потому что он определяет IE, не спотыкаясь об Opera.

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

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

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 );

Редактировать:Решение, приведенное ниже, не рекомендуется.Вместо этого попробуйте это: http://whatbrowser.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();

Затем проверьте тип и версию браузера следующим образом:(например.Интернет Эксплорер 8)

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

и т. д.

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

Для 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> ярлык.Видеть это пример Чтобы получить больше информации

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top