Как сделать обнаружение браузера с jQuery 1.3 с устаревшим $ .browser.msie? - PullRequest
24 голосов
/ 18 января 2009

Как должно выполняться определение браузера теперь, когда jQuery 1.3 устарел (и я предполагаю, что он будет удален в будущей версии) $ .browser.msie и аналогичных?

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

$.browser.opera
$.browser.safari
$.browser.mozilla

... ну, я думаю, что это все из них:)

В местах, где я его использую, я не уверен, какая проблема с браузером вызывает проблему, потому что часто я просто пытаюсь исправить разницу в 1 px в браузере.

Редактировать: С новой функциональностью jQuery невозможно определить, используете ли вы IE6 или IE7. Как определить это сейчас?

Ответы [ 16 ]

33 голосов
/ 24 февраля 2009

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

Итак, мой ответ - ничего не делать, пока:)

edit: я даже предоставлю вам плагин для использования в будущем (не тестировался, скопирован из источника jquery):

(function($) {
    var userAgent = navigator.userAgent.toLowerCase();

    $.browser = {
        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
        safari: /webkit/.test( userAgent ),
        opera: /opera/.test( userAgent ),
        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
    };

})(jQuery);
9 голосов
/ 19 января 2009

Я столкнулся с чем-то похожим, нет $ .support.png (p.ej.), поэтому мне еще нужно использовать $ .browser.version, может быть, мы можем просто продолжать просить дополнительные свойства $ .support.XXXX столько, сколько нужно.

8 голосов
/ 18 января 2009

.browser устарел в пользу .support. Более подробная информация здесь: jquery.support По сути, это означает, что вместо использования перехвата браузера, jquery теперь поддерживает обнаружение функций и обеспечивает более точный контроль над возможностями браузера.

Из описания:

Добавлено в jQuery 1.3. Коллекция свойства, которые представляют присутствие различных функций браузера или ошибок.

JQuery поставляется с рядом свойства включены, вы должны чувствовать свободно добавлять свои собственные. Многие из них свойства довольно низкого уровня, так сомнительно, что они будут полезны в общем повседневное развитие, но в основном используется плагином и ядром Разработчики.

Значения всей поддержки свойства определяются с помощью обнаружение функции (и не использовать какие-либо форма браузера нюхает)

5 голосов
/ 19 ноября 2009

Обнаружение браузера не устарело в jQuery. Страница документа для jQuery.browser , которая гласит:

Мы не рекомендуем использовать это свойство, попробуйте вместо этого использовать функцию обнаружения функций (см. JQuery.support).

Амортизация означает «намечено для будущего удаления». Этот совет о поиске возможностей, а не пользовательских агентов, является просто хорошим общим советом, а не специфичным для jQuery. Все, что они говорят, это то, что им легче делать правильные вещи.

Однако всегда будет необходимость в прослушивании пользовательского агента. Если jQuery.support не обновляется ежедневно армией разработчиков, то просто невозможно поспевать за каждой ошибкой и каждой функцией в каждой второстепенной версии каждого браузера.

Я думаю, что путаница по этому поводу возникла из-за того факта, что внутренне jQuery больше не делает перехват браузера. Но утилита API jQuery.browser продолжит существовать.

5 голосов
/ 04 февраля 2009
* Поддержка функции

звучит неплохо, НО она будет работать так, как задумано, когда она поддерживает все возможные «ошибки». Как и в первом комментарии, здесь нет ни $ support.png, ни $ support.stepping, ни $ support.peekaboo, ни, о, список можно продолжить. Проблема заключается в том, что некоторый код, обеспечивающий совместимость с одним браузером, неизбежно будет выполняться браузером, который в этом не нуждается.

4 голосов
/ 09 октября 2009
function browserLessThanIE7(){
   return (/MSIE ((5\\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
}

Может также работать нормально ... Этот проверяет версии 5, 5.5 и 6.

@ Nate: измените (5 \ .5) | 6 на 7 и проверьте версию 7.

2 голосов
/ 21 апреля 2010

Почему нельзя переписать jquery.browser для внутреннего использования jquery.support для определения браузера на основе функций (возможно, дополненных текущими методами из jquery.browser, где это необходимо), чтобы обеспечить удобное средство выбора для браузера семейство и версия, хотя, возможно, более надежный, чем сегодняшний jquery.browser?

2 голосов
/ 04 марта 2010

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

Горизонтальное центрирование элемента с использованием автоматических полей работает для всех браузеров, кроме IE. Какую функцию я проверяю? Я понятия не имею. Но я знаю, в каком браузере он не работает.

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

В свете этого "Мы рекомендуем не использовать это свойство, попробуйте вместо этого использовать обнаружение функций", следует удалить со страницы документации jQuery.browser. Это вводит в заблуждение.

2 голосов
/ 13 марта 2009

Я говорю, перепроектируй это из кодовой базы jQuery 1.2.

См. Этот раздел кода:

jQuery.browser = {
    version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
    safari: /webkit/.test( userAgent ),
   opera: /opera/.test( userAgent ),
  msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
  mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};

Уважайте лицензии GPL и MIT и изучайте код. Не копируйте и не вставляйте.

Или специально для обоняния IE6. Вы могли бы сделать:

function IsThisBrowserIE6() {
    return ((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined))
}
1 голос
/ 17 августа 2011

Я хотел бы отметить, что 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.

...