Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Navigator. как лучше пользоваться? (https://javascript.ru/forum/misc/31684-navigator-kak-luchshe-polzovatsya.html)

dmitry111 17.09.2012 08:15

Navigator. как лучше пользоваться?
 
Посоветуйте как лучше отфильтровать браузеры?


На какое свойство navigator ориентироваться при определении браузера?


Из наблюдений могу сказать:

navagator.appName == "Opera" // true  для opera
navagator.appName == "Microsoft Internet Explorer" // true для ms
navigatot.vendor == "Apple Computer, Inc." // true для safari
navigator.vendor == "Google Inc." // true для chrome
navigator.oscpu // такое свойство есть только у firefox



Тестил в свежих браузерах.

Как вы ориентируетесь в браузерах?
Посоветуйте способы определения (желательно без regEx) браузера не зависимо от версии.

Может есть какой-то готовый небольшой(!) плагинчик?

dmitry111 17.09.2012 08:43

Вот плагин который поможет узнать название браузера:

<!DOCTYPE HTML>
<html>
<head>
    <script>
        function go() {

            if (navigator.appName == "Opera") {
                alert("opera");
            }
            if (navigator.appName == "Microsoft Internet Explorer") {
                alert("ms");
            }
            if (navigator.vendor == "Apple Computer, Inc.") {
                alert("safari");
            }
            if (navigator.vendor == "Google Inc.") {
                alert("chrome");
            }
            if (navigator.oscpu) {
                alert("firefox");
            }

        }
    </script>


</head>
<body>

<button onclick="go();">узнать браузер</button>
</body>
</html>

Плагин успешно работает в:
-ie 7,8,9
-safari 6.0
-opera 12.02
-firefox 15.0.1
-chrome 21.0.1180.89

dmitry111 17.09.2012 08:45

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

.. ну или предложите свой метод определения браузера )

Riim 17.09.2012 09:11

Быстренько набросал давно уже:

var Browser = {};

if (/(Trident|Gecko|WebKit|KHTML|Presto)\W*([.,\w]+)*/i.test(navigator.userAgent)) {
	Browser.layoutEngineName = RegExp.$1.toLowerCase();
	Browser.layoutEngineVersion = RegExp.$2;
}

if (window.opera) {
	Browser.name = 'opera';
	Browser.version = opera.version();
} else if (/(MSIE|Firefox|Chrome|Safari|Konqueror)\W*([.,\w]+)*/i.test(navigator.userAgent)) {
	Browser.name = RegExp.$1.toLowerCase();
	Browser.version = RegExp.$2;
}

dmitry111 17.09.2012 09:19

Riim,
мощно, зачот! :thanks:

bes 17.09.2012 09:45

navigator.userAgent.indexOf('ключевое слово')
PS: в принципе не стоит разграничивать код по браузерам

dmitry111 17.09.2012 11:54

bes,

сенкс, что-то даже не подумал, что можно выцепить с помощью indexOf. В дебри полез :)
Цитата:

Сообщение от bes (Сообщение 205086)
PS: в принципе не стоит разграничивать код по браузерам

Да не, мне пустячок с курсорами решить надо было.

dmitry111 17.09.2012 11:59

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 205087)
а вообще да ОП, гугл для слабых.

Мне кажется вы переоцениваете гугл :)

bes 17.09.2012 12:03

Цитата:

Сообщение от dmitry111
сенкс, что-то даже не подумал, что можно выцепить с помощью indexOf. В дебри полез

главное правильно выбирать ключевые слова, а то некоторые повторяются: Chrome, Firefox, MSIE, Opera, вроде так

dmitry111 17.09.2012 12:17

да, сафари и хром повторяются. Ну они и работают более или менее идентично.

devote 17.09.2012 12:23

Цитата:

Сообщение от Дзен-трансгуманист
Насколько я знаю, определять браузер лучше по его функционалу

вот именно, что браузер вообще определять не нужно... нужно писать код из расчета того что в нем есть... сегодня может что-то в нем и нет, а завтра может появится... и все эти агенты совершенно ни к чему..

melky 17.09.2012 12:27

Цитата:

Сообщение от devote
вот именно, что браузер вообще определять не нужно... нужно писать код из расчета того что в нем есть... сегодня может что-то в нем и нет, а завтра может появится... и все эти агенты совершенно ни к чему..

согласен. если определение браузера происходит для определения фич, то так делать нельзя.

Riim 17.09.2012 14:01

Цитата:

Сообщение от devote
вот именно, что браузер вообще определять не нужно... нужно писать код из расчета того что в нем есть... сегодня может что-то в нем и нет, а завтра может появится... и все эти агенты совершенно ни к чему

+1, определять браузеры обычно для сбора статистики нужно.

bes 18.09.2012 11:14

Цитата:

Сообщение от Maxmaxmахimus
Как он вопрос сформировал так и надо отвечать.

Max-s, ты ли это? не узнаю :D

devote 18.09.2012 11:19

Цитата:

Сообщение от Maxmaxmахimus
например, в опере при скроллинге направление скроллинга выдается не правильное , там -1 заменен на 1.

И в какой это опере? что-то ни разу не сталкивался с проблемами колеса мыши

devote 18.09.2012 11:38

Цитата:

Сообщение от Maxmaxmахimus
Или таких "багов" не существует по твоему?

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

А насчет багов, эти проблемы как правило всегда можно решить без определения браузеров и цепляния к ним. Любой Баг/Фичу всегда можно выделить. Для этого при инициализации библиотеки(своей или любой другой, например джуквери), происходит тестирование браузера на те или иные баги... И этот способ дает возможность работать правильно браузеру потом, когда будет исправлен баг.. А привязка к браузеру/агенту не даст возможность работать потом корректно, даже если баг будет убран.

dmitry111 18.09.2012 15:14

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 205268)
например, в опере при скроллинге направление скроллинга выдается не правильное , там -1 заменен на 1. Вопрос как это тестировать???? по моему лучше для оперы сделать сразу фикс.

это не в опере, а в firefox.

dmitry111 18.09.2012 15:27

Вот какой способ определения типа браузера и версии предлагает Флэнаган в 6-м издании:

var browser = (function() {
    var s = navigator.userAgent.toLowerCase();
    var match = /(webkit)[ \/]([\w.]+)/.exec(s) ||
    /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(s) ||
    /(msie) ([/w.]+)/.exec(s) ||
    !/compatible/.test(s) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(s) ||
    [];
    return { name: match[1] || "", version: match[2] || "0" };
}());


Часовой пояс GMT +3, время: 06:58.