Обнаружение браузера
-
01-07-2019 - |
Вопрос
Какой лучший/самый простой/точный способ определить браузер пользователя?
Простота расширения и реализации является плюсом.
Чем меньше технологий используется, тем лучше.
Решение может быть на стороне сервера, на стороне клиента или на обеих сторонах.Однако в конечном итоге результаты должны оказаться на сервере.
Решение может быть независимым от платформы.
Решение будет использоваться только для целей отчетности.
Решение
На сервере вы в значительной степени ограничены строкой 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:»).