Функция определения браузера и его версии
Как-то потребовалось создать функцию, принимающую объект json со следующим форматом записи: "браузер":то, что следует вернуть, иначе говоря такую функцию, которая бы возвращала указанный объект в зависимости от браузера пользователя.
ТЗ, которое я для себя определил:
- браузеры можно группировать, указывая их через пробел
- браузерам можно задавать версию (ie6,opera10)
- браузерам можно задавать полную версию (opera10.15)
- поддержка самых популярных браузеров
Мой способ гарантированно не самый точный, так как он используют свойство userAgent объекта navigator, которое при желании подделывается, но с другой стороны любой способ проверки клиента как серверный, так и клиентский можно обойти. Так же встает вопрос о надобности такой "подделки", тем более мало какие роботы исполняют javascript код.
После изучения следующей статьи http://ru.wikipedia.org/wiki/Useragent, я написал функцию ifBrowser. Она поддерживает проверку следующий браузеров: Internet Explorer, Firefox, Opera, Chrome, Safari, Konqueror, Iceweasel, SeaMonkey.
Код функции:
/*
ifBrowser 0.0.3
a function which returns specified data depending on a user's browser
written by Plyushch Gregory, 2012
is free to use for everyone in condition of saving the author's name
*/
function ifBrowser (obj) {
var none = obj["none"] || "none";
function cBrowser() {
var ua = navigator.userAgent;
var bName = function () {
if (ua.search(/MSIE/) > -1) return "ie";
if (ua.search(/Firefox/) > -1) return "firefox";
if (ua.search(/Opera/) > -1) return "opera";
if (ua.search(/Chrome/) > -1) return "chrome";
if (ua.search(/Safari/) > -1) return "safari";
if (ua.search(/Konqueror/) > -1) return "konqueror";
if (ua.search(/Iceweasel/) > -1) return "iceweasel";
if (ua.search(/SeaMonkey/) > -1) return "seamonkey";}();
var version = function (bName) {
switch (bName) {
case "ie" : return (ua.split("MSIE ")[1]).split(";")[0];break;
case "firefox" : return ua.split("Firefox/")[1];break;
case "opera" : return ua.split("Version/")[1];break;
case "chrome" : return (ua.split("Chrome/")[1]).split(" ")[0];break;
case "safari" : return (ua.split("Version/")[1]).split(" ")[0];break;
case "konqueror" : return (ua.split("KHTML/")[1]).split(" ")[0];break;
case "iceweasel" : return (ua.split("Iceweasel/")[1]).split(" ")[0];break;
case "seamonkey" : return ua.split("SeaMonkey/")[1];break;
}}(bName);
return [bName,bName + version.split(".")[0],bName + version];
}
var current_browser = cBrowser();
for (var key in obj) {
var trg = key.toLowerCase();
if (trg.indexOf(current_browser[2]) > -1) return obj[key];
else if (trg.indexOf(current_browser[1]) > -1) return obj[key];
else {
var nsymbol = trg.charAt(trg.indexOf(current_browser[0])+current_browser[0].length);
if (trg.indexOf(current_browser[0]) > -1 && (nsymbol == " " || nsymbol == "")) return obj[key];
};
}
return none;
}
http://gregivy.tf9.ru/ivyco/ifbrowser.js
В случае если ни одного выражение не совпадает с браузером пользователя, возвращается "none", которое можно также указать как свойство передаваемого объекта.
Пример использования: (данный код повернет на 25 градусов все содержимое страницы в любом современном браузере)
var transform = ifBrowser({
"ie":"msTransform",
"chrome safari":"WebkitTransform",
"firefox":"MozTransform",
"opera":"OTransform",
}) // определяем название нужного нам css свойства
document.body.style[transform] = "rotate(25deg)"
Пример наклона картинки на 60 градусов
Название браузера нужно вводить в следующем формате : ie, firefox, opera, chrome, safari, konqueror, iceweasel, seamonkey. Регистр неважен. Версия пишется слитно с название, пример: ie7. Если для нескольких браузеров должно возвратиться одно и тоже значение, вы просто указываете их через пробел, как
на примере ("chrome safari":"WebkitTransform"). В качестве возвращаемого значения может выступать любой объект JavaScript (строка, число, функция, логическое значение и т.д.)
|
Зачем проверять версию браузера и юзерагент, когда надо проверять то, что он умеет. Тем более, что ваш код даст огромную погрешность. Да и многие браузеры неправильно отдают свой агент.
Я перечислил какие браузеры поддерживаются, они не будут "неправильно" отдавать свой юзер-агент. И версия для каждого браузера определяется по индивидуальному правилу. Мне так же интересно, как вы будете проверять то, что умеет браузер, с большей пользой, когда любое свойство можно подменить, как и юзер-агент.
Это они на текущий момент не будут неправильно отдавать юзер-агент. Но никто не может поручиться за то, что будет завтра.
Конечно, проверять надо поддержку браузером конкретных свойств и методов. Путаница в юзер-агентах — правило, а неправильное определение стандартных свойств и методов — редкое исключение и косяк.
юзерагент без затей меняется, например в фаерфоксе без всяких бубнов, в системных параметрах браузера. к сожалению предложенный вами способ ненадежен и необъективен
И что?) Кому это нужно?) С таким же успехом можно подделать любое свойство в javascript'е. Например, только в google chrome у объекта window есть свойство chrome, и многие именно так определяют браузер (вообще не важно какое свойство подменять, я просто привел пример). Подменяем: window.chrome = {}. Теперь программа будет думать, что пользователь использует гугл хром. Вот только все равно не понятно, зачем пользователю это нужно. Если пользователь достаточно грамотный, и меняет юзер агент браузера, то он соответственно понимает, что делает) Вы же не сможете защить свой сайт от того, что какой-то пользователь решил подключить к браузеру плагин удаляющей определенный контент со страницы, или от того, что пользователь пару dom-элементов удалил через консоль того же хрома.
В Opera он тоже легко подменяется в параметре Custom User Agent в opera:config. Там же меняется и navigator.appName.
судя по скрипту, он ищет непонятно где, не ясно что. где сам источник версии браузера, откуда берутся аргументы?
Спасибо! Везде работает кроме IE!!! :D (ie 6-ка)
IE Стабилен, как всегда
Спасибо за понятный и прозрачный код.
Не понимаю зачем было разводить флейм на тему ненадежности метода. 90% пользователей вообще не знают про строку юзерагента, а те, кто знают, изменяя эту строку, сами себе становятся злобными буратинами.
Автору зачет, респект и уважуха.
Все течет, все меняется - в IE10 данная функция работать не будет, потому что она ищет в userAgent подстроку "MSIE", а десятый ослик userAgent отдает вот такой: "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko". Т.е. надо добавить поиск по названию IE-шного движка - Trident.
Спс большое за мануал!
вах вах вах. в IE10 зер гуд как работает у меня. Вот в IE11 не работает. Пришлось немного отсебятины сделать.
Author thank you very much!
Вот, переделал под современные реалии и улучшил юзабилити:
Результат выполнения функции:
Определение мобильных браузеров не поддерживается, но для них возвращается platform: "mobie".
Konqueror, Iceweasel, SeaMonkey выкинул за ненадобностью. Кому нужно их определять в 2016 году даже представить не могу.
Roksa z twarzami
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.