Определение типа браузера и версии, по возможностям браузера/движка
вот решил сюда отписать решение по определению браузера на основе возможностей браузера или специальных методов свойственных конкретному браузеру/движку
для начала приведу пример как я пытаюсь выяснить тот или иной браузер, путем проверок наличия тех или иных методов: 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) {}Хотя что вы будете делать со значением в переменой это решать вам. Я лишь привел один из примеров. Это все что у меня пока пришло в голову, так же хотелось бы придумать возможность определения движков и тип браузера (мобильный, настольный и т.д.). Если есть идеи по этому вопросу, буду признателен выслушать их. Так же не против выслушать критику по методам описанным выше. Всем спасибо! |
IE < 9. моя любимая проверка. это к слову.
ielt9 = '\v'=='v'; |
Цитата:
|
Цитата:
Стараюсь писать код совместимый с браузерами, всеми кроме IE, всегда получалось, кроме Оперы один раз. IE проверяю, когда что-то нужно чтобы работало, а оно не работает в IE. Под него проще писать свой код или не писать ;) ps: без либ уже не пишу, а там есть и проверка и версии. |
Цитата:
|
Цитата:
|
Цитата:
|
А почему это баг? Просто вертикальная табуляция не поддерживается, поэтому
v не преобразуется в спец символ. Для других символов тоже верно:alert("\o" == "o") //true во всех браузерах |
Цитата:
Но все же никто по теме посоветовать ничего не может? |
Цитата:
Если хочется найти более корректное или оптимальное решение, то следует посмотреть исходники популярных либ. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
PS. можно так же проверить версию браузера через реализацию каких-нибудь фич, вроде css animations. |
devote,
у вас очень популярное заблуждение: вы, наверное, думаете, что это вы feature detection сделали. Нет, это не feature detection, это browser detection. Это чуть лучше, чем проверка userAgent, но лучше только тем, что userAgent можно подменить. Feature detection -- это когда проверяется наличие конкретной фичи перед тем, как использовать эту фичу. Например. // feature detection if (window.addEventListener) { window.addEventListener(...); } else if (window.attachEvent) { window.attachEvent(...); } // не feature detection if ('\v' == 'v') { window.attachEvent(...); } else { window.addEventListener(...); } Есть фичи, наличие которых проверить нельзя. Как правило это различные баги браузеров. Тогда остаётся только browser detection. Неважно какой, они все плохие. Хотя проверка специфических переменных лучше, чем userAgent. |
Kolyaj, нет, речь идёт не об определении возможностей браузера, а об определении браузера и версии браузера по наличию в них каких-то фич.
|
Цитата:
|
devote,
Features |
Цитата:
|
Цитата:
Цитата:
Если вы хотите сделать определение браузера в виде универсальной бибилиотеки, то используйте userAgent как это делают все, если же вам нужно сделать библиотеку, которая будет служить основой для определения feature, то посмотрите как это сделано в has.js |
Цитата:
|
Если делать универсальное решение, с IE и Opera думаю вполне решаемая задача, а вот для других браузеров без использрвания userAgent не обойтись, т.к. FF за свое существование менял несколько раз движок, в WebKit тоже не все гладко, постоянно что-то добавляют/удаляют
|
Цитата:
|
Можно установить все предыдущие билды и составить матрицу, однако нет никакой уверенности в том, что в следующем поколении не вылезут старые особенности.
Для этой цели придется брать за основу bag detections и особенности движков (лучше смотреть исходники, если доступны), затем проверять feature detections на случай если всплыли старые баги в новом билде и опцинально userAgent. Вобщем работа не простая. |
Часовой пояс GMT +3, время: 20:05. |