Как сделать обнаружение браузера с помощью jQuery 1.3 с устаревшим $ .browser.msie?

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

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

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

... ну думаю, это все :)

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

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

Думаю, вопрос в том, зачем нужно определять между IE6 и IE7?

Ray Booysen 19.01.2009 01:49

Поскольку сайт работает во всех браузерах, кроме IE, с небольшой настройкой для всех браузеров IE, но в IE6 он полностью ломается, когда вещи размещаются в совершенно неправильных местах. Я использую допустимый тип документа и все остальное.

Darryl Hein 19.01.2009 02:13

Честно говоря: вы делаете что-то не так, если в IE6 что-то ломается.

cletus 19.01.2009 02:34

Конечно, это проблема CSS, а не JS. И дошли до того, почему вы просто не можете написать JS, чтобы сделать это?

annakata 24.02.2009 12:33

Как бы то ни было, в ie6 есть некоторые ошибки отображения, которые нужно компенсировать, которых нет ни в одном другом браузере, например, размещение div над полем выбора. Обнаружение IE6 полезно для добавления чего-то вроде взлома iframe, чтобы скрыть поля выбора.

Gavin M. Roy 14.05.2009 01:33

@cletus, если честно, IE6 - это такая ерунда, что причудливые ошибки могут вызывать радикальные позиции и "прыгать" с прекрасным CSS.

seanmonstar 23.02.2010 08:30
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
24
6
51 147
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

jQuery 1.3 заменил тестирование браузера.

Честно говоря, я удивлен, как часто веб-разработчики обеспокоены тем, в каком браузере работает их сайт. За 10 с лишним лет веб-разработки я могу вспомнить несколько случаев, когда я заботился, не говоря уже о том, чтобы делать что-то другое. Самая распространенная причина заключалась в том, что размеры именованных шрифтов значительно различаются между Firefox и IE (font-size: large намного больше в IE, чем FF), поэтому я использовал файл IEfix.css, чтобы исправить это.

Возможно, вам стоит взглянуть на Что лучше: взлом CSS или обнаружение браузера? для более подробного обсуждения этой темы.

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

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

Да, я знаю это, но мой вопрос: что мне теперь делать?

Darryl Hein 19.01.2009 00:52

Вы проверяете функции, которые вам нужны, а не имя браузера.

cletus 19.01.2009 02:00

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

Darryl Hein 19.01.2009 02:14

Ничего себе, я не могу поверить, сколько людей решили не поддерживать IE6. Из всех моих корпоративных клиентов только 2 (из 10) перешли на IE7, и это через 2 года после выпуска IE7. Я ненавижу это, но это реальность, корпоративные клиенты пока не доверяют IE7.

Darryl Hein 19.01.2009 06:31

Я могу понять, что не доверяю IE7. Однако я не могу понять это в контексте доверия IE6. :)

cletus 19.01.2009 07:16

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

Chris Haines 21.07.2009 13:46

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

Из описания:

Added in jQuery 1.3 A collection of properties that represent the presence of different browser features or bugs.

jQuery comes with a number of properties included, you should feel free to add your own. Many of these properties are rather low-level so it's doubtful that they'll be useful in general day-to-day development, but mostly used by plugin and core developers.

The values of all the support properties are determined using feature detection (and do not use any form of browser sniffing)

Ответ принят как подходящий

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

Думаю, это правильный путь. Неважно, используете ли вы IE или Firefox - важные вопросы: «Поддерживает ли он прозрачные PNG?» или "Это модель Box сломана?"

Michael Stum 09.10.2009 20:35

Однако может быть важно знать, в каком браузере вы хотите отображать соответствующие скриншоты ...

Neil Fenwick 03.12.2009 13:40

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

Попробуйте скрипт GeckoFix в http://code.labor8.eu/geckoFix, он обнаруживает Firefox ниже 3.0, поэтому вы можете настроить его, как хотите (т.е. добавив к нему больше правил, таких как обнаружение Firefox 2, Firefox 3, Opera и Safari). Думаю, это может быть то, что вы ищете. Чтобы проверить агент пользователя, просто введите в адресной строке javascript: alert (navigator.userAgent) и найдите некоторые конкретные символы, которые вам нужно будет ввести в скрипт.

Да, обнаружение браузера устарело, но устаревшие свойства, вероятно, не будут удалены из 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);

@MedicineMan: Как и любой плагин jQuery, включите его где-нибудь на своей странице, и теперь у вас есть методы $.browser.msie и так далее. Как говорит kkyy, это существует (даже в 1.3 и 1.4) в исходном коде jQuery, поэтому проверьте это (я рекомендую прочитать все это, очень поучительно). В любом случае вы можете захотеть получить обновленную версию из jQuery 1.4, потому что он нормализует safari / chrome / etc до $.browser.webkit.

rfunduk 04.03.2010 05:10

Я говорю, что перепроектируйте его из кодовой базы 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))
}

В этом нет необходимости, потому что код все еще существует и его можно использовать в jQuery 1.3 (и 1.4).

rfunduk 04.03.2010 05:11

думали, что они прошли весь маршрут "функций"?

BuddyJoe 18.06.2010 01:16

У меня есть кусок Javascript, который отлично работает в браузерах Mozilla и Webkit, а также в IE8. Однако в 6 и 7 ломается. Это не имеет ничего общего ни с CSS, ни с плохим Javascript, но с дрянной поддержкой IE <8.

Я могу видеть, откуда люди приходят к проверке «функций», а не к обнюхиванию браузера, однако функции, для которых доступно обнюхивание, не имеют отношения к нарушающему коду, так в чем же тогда разница между обнюхиванием браузера и обнюхиванием функций до тех пор, пока ВСЕ функции доступны в объекте $ .support?

function browserLessThanIE7(){
   return (/MSIE ((5\\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
}

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

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

Очень понравилось. Спасибо!

neoswf 09.08.2011 22:06

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

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

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

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

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

Они также заявляют: «Свойство $ .browser устарело в jQuery 1.3, но в ближайшее время нет планов по его удалению».

CRice 11.10.2010 07:34

Возможно, это не самый чистый способ для IE 6, но он определенно работает и его легко понять:

$(document).ready(function() {
    ie6catch = $.browser.msie + $.browser.version;
    if (ie6catch.indexOf("true6") == -1) {
        alert("This is not Internet Explorer 6");
    }
});

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

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

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

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

Было бы неплохо добавить браузеры как класс к тегу body для css. Не уверен, что это работает, потому что я не запускаю Windows и у меня есть powerPC, но он должен поставить класс .ie6 для всех Internet Explorer 6-9, что не очень полезно. Для всего остального используйте mooModernizr.

if (Browser.Engine.trident) {

    var IEbrowser = $('body');

    IEbrowser.addClass('ie');

}​

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

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

var browser = {
        chrome: false,
        mozilla: false,
        opera: false,
        msie: false,
        safari: false
    };
    var sBrowser, sUsrAg = navigator.userAgent;
    if (sUsrAg.indexOf("Chrome") > -1) {
        browser.chrome = true;
    } else if (sUsrAg.indexOf("Safari") > -1) {
        browser.safari = true;
    } else if (sUsrAg.indexOf("Opera") > -1) {
        browser.opera = true;
    } else if (sUsrAg.indexOf("Firefox") > -1) {
        browser.mozilla = true;
    } else if (sUsrAg.indexOf("MSIE") > -1) {
        browser.msie = true;
    }
console.info(browser.msie);

Другие вопросы по теме