Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.01.2012, 17:22
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Определение типа браузера и версии, по возможностям браузера/движка
вот решил сюда отписать решение по определению браузера на основе возможностей браузера или специальных методов свойственных конкретному браузеру/движку

для начала приведу пример как я пытаюсь выяснить тот или иной браузер, путем проверок наличия тех или иных методов:
hasIE = window.eval && eval("/*@cc_on 1;@*/");
hasOpera = !!window.opera;
hasChrome = !!window.chrome;
hasFireFox = !!window.sidebar;
hasSafari = !window.external && !hasOpera;

Как мы видим все логично и понятно. ИЕ имеет возможность компиляцию условных выражений внутри комментариев. Тем самым мы можем точно выяснить принадлежность движка ИЕ.

В опере и хроме есть встроенные объекты позволяющие нам узнать что за браузер мы используем, для оперы определяем наличие объекта window.opera для хрома window.chrome. По сути тоже все логично.

ФайрФокс и Сафари все немного иначе, файрфокс использует движок Gecko и именно в этом движке имеется объект window.sidebar. Который нужен для работы с боковой панелью браузера. Именно наличие этого объекта нам дает возможность выяснить о принадлежности движка Gecko.

Для сафари совсем все немного иначе, мы просто смотрим отсутствие объекта window.external и смотрим не опера ли это. Так как именно эти два браузера не имеют в наличии объекта window.external.

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

Что у меня вышло:
hasIE = window.eval && eval("/*@cc_on 1;@*/") && (/msie (\d+)/i.exec(navigator.userAgent) || [,true])[1];
hasOpera = !!window.opera && window.opera.version && window.opera.version();
hasChrome = !!window.chrome && (/chrome\/([\d\.]+)/i.exec(navigator.userAgent)[1] || true);
hasFireFox = !!window.sidebar && (/firefox\/([\d\.]+)/i.exec(navigator.userAgent)[1] || true);
hasSafari = !window.external && !hasOpera && (/safari\/([\d\.]+)/i.exec(navigator.userAgent)[1] || true);


Здесь все просто,

Опера имеет внутренний метод с помощью которого можно получить номер версии браузера.

Для всех остальных браузеров приходится версию получать из строки UserAgent и в случае неудачи мы будем иметь не строку версии а значение true в переменной если имеем дело с этим браузером.

В заключении хочу сказать, что каждая переменная имеет тип строка, с номером версии данного браузера. И нам достаточно просто выполнить подобное действие в коде что бы работать далее:
if (hasIE && parseInt(hasIE) == 7) {}
Хотя что вы будете делать со значением в переменой это решать вам. Я лишь привел один из примеров.

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

Всем спасибо!

Последний раз редактировалось devote, 11.10.2013 в 17:11.
Ответить с цитированием
  #2 (permalink)  
Старый 21.01.2012, 17:59
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

IE < 9. моя любимая проверка. это к слову.
ielt9 = '\v'=='v';
Ответить с цитированием
  #3 (permalink)  
Старый 21.01.2012, 18:10
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от melky Посмотреть сообщение
IE < 9. моя любимая проверка. это к слову.
ielt9 = '\v'=='v';
Это баг движка ИЕ, а на багах лучше не ориентироваться. Ну а вообще да, простая возможность.
Ответить с цитированием
  #4 (permalink)  
Старый 21.01.2012, 18:21
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от melky Посмотреть сообщение
моя любимая проверка.
У меня давно стандартная.

Стараюсь писать код совместимый с браузерами, всеми кроме IE, всегда получалось, кроме Оперы один раз. IE проверяю, когда что-то нужно чтобы работало, а оно не работает в IE. Под него проще писать свой код или не писать

ps: без либ уже не пишу, а там есть и проверка и версии.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #5 (permalink)  
Старый 21.01.2012, 18:28
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Gozar
IE проверяю, когда что-то нужно чтобы работало, а оно не работает в IE.
Ну у меня чаще всего что-то не работает дык это в ИЕ7. а в ИЕ8 норм. И подобная конструкция '\v'=='v'; увы не даст мне знать ИЕ7 ли это.
Ответить с цитированием
  #6 (permalink)  
Старый 21.01.2012, 18:31
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от devote Посмотреть сообщение
Это баг движка ИЕ, а на багах лучше не ориентироваться. Ну а вообще да, простая возможность.
этот баг уже так долго существует, что перешёл из разряда "багов" в разряд "фич". мне кажется, что и уйдёт он со смертью IE.
Ответить с цитированием
  #7 (permalink)  
Старый 21.01.2012, 18:35
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от melky
этот баг уже так долго существует, что перешёл из разряда "багов" в разряд "фич". мне кажется, что и уйдёт он со смертью IE.
Ну это да, если в МС есть баг, то это автоматом не баг а фича. Ибо МС не особо старается их убирать. Так что я согласен, что по отношению к МС это нельзя считать багом
Ответить с цитированием
  #8 (permalink)  
Старый 21.01.2012, 18:39
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

А почему это баг? Просто вертикальная табуляция не поддерживается, поэтому v не преобразуется в спец символ. Для других символов тоже верно:
alert("\o" == "o") //true во всех браузерах
Ответить с цитированием
  #9 (permalink)  
Старый 21.01.2012, 18:45
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Octane
Просто вертикальная табуляция не поддерживается
Согласен, беру свои слова обратно о баге.

Но все же никто по теме посоветовать ничего не может?
Ответить с цитированием
  #10 (permalink)  
Старый 21.01.2012, 21:55
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от devote
Но все же никто по теме посоветовать ничего не может?
Зачем это вообще нужно?
Если хочется найти более корректное или оптимальное решение, то следует посмотреть исходники популярных либ.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение версии браузера Beck Events/DOM/Window 16 15.10.2015 13:32
Точное определение браузера YISHIMITSY Javascript под браузер 3 23.10.2012 19:43
Определение размеров клиентской части браузера Шацкий Денис Общие вопросы Javascript 10 09.01.2011 19:27
Определение активности окна браузера Dextrum Events/DOM/Window 2 23.07.2008 13:58
Не просто определение типа браузера... Driver86 Общие вопросы Javascript 6 08.04.2008 21:35