Я хотел бы отметить, что navigator.userAgent
не очень заслуживает доверия, в том смысле, что его легко изменить, и он может не соответствовать реальному браузеру, просматривающему страницу.
Это может быть одной из причин, по которой $.browser
вообще не рекомендуется.
Но ради вопроса, давайте предположим, что обнаружение браузера абсолютно необходимо .
Я наткнулся на этот очень крутой фрагмент Джеймса Падолси , который на самом деле различает Internet Explorer с помощью условных комментариев.
Я скомпилировал небольшой фрагмент кода с приведенным выше фрагментом и некоторым кодом из yepnope.js :
(function(window, doc) {
window.detector = window.detector || (function() {
var undef,
docElement = doc.documentElement,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i'),
isGecko = ( 'MozAppearance' in docElement.style ),
isGeckoLTE18 = isGecko && !! doc.createRange().compareNode,
isOpera = !! ( window.opera && toString.call( window.opera ) == '[object Opera]' ),
isWebkit = ( 'webkitAppearance' in docElement.style ),
isNewerWebkit = isWebkit && 'async' in doc.createElement('script');
while (
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return {
isGecko: isGecko,
isGeckoLTE18: isGeckoLTE18,
isGeckoGT18: isGecko && ! isGeckoLTE18,
isOpera: isOpera,
isWebkit: isWebkit,
isNewerWebkit: isWebkit && 'async' in doc.createElement('script'),
isIE: ( v > 4 ),
ieVersion: ( v > 4 ? v : undef )
};
}());
}(window, document));
Различает браузеры по их возможностям.
Только проблемы в том, что в настоящее время у меня нет возможности различить Safari и Chrome (оба браузера Webkit) и между версиями самих браузеров Gecko, Webkit и Opera.
Я знаю, что это не идеально, но это небольшое улучшение по сравнению с navigator.userAgent
.