Самая простая/легкая замена для обнаружения браузера jQuery 1.9?

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

Я (быстро) посмотрел документы 1.9 change, и кажется, что они хотят, чтобы я заменил некоторые довольно тяжелые библиотеки только для этой одной функции.

Есть ли рекомендованный легкий плагин или фрагмент кода для восстановления этой функции?

Для чего нужны эти сайты, это очень просто; Мне нужно только самое основное обнаружение IE vs FF против всех остальных.

Предложения?

Ответ 1

Я использую следующий код, который ответил Alexx Roche, но я хотел обнаружить MSIE, поэтому:

<script type="text/javascript">
   $(document).ready(function() {
      if (navigator.userAgent.match(/msie/i) ){
        alert('I am an old fashioned Internet Explorer');
      }
   });
</script>

надеюсь, что это поможет!

Ответ 2

jQuery Migrate был создан для обеспечения обратной совместимости при обновлении кода.

https://github.com/jquery/jquery-migrate

В качестве бонуса он регистрирует устаревшие функции по мере их использования. Я бы попробовал, пока вы решаете проблемы. Кроме того, вы должны установить определенную версию jQuery для своих сайтов. Это хорошо для обновления, но не забудьте проверить эти обновления, прежде чем вводить их в производство. Если вы используете CDN, вы все равно можете указать определенную версию в имени файла.

Теперь вам не нужен плагин jQuery для того, что вы просите. Проверьте объект navigator.

appCodeName: "Mozilla"
appName: "Netscape"
appVersion: "5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"
cookieEnabled: true
doNotTrack: null
geolocation: Geolocation
language: "en-US"
mimeTypes: MimeTypeArray
onLine: true
platform: "MacIntel"
plugins: PluginArray
product: "Gecko"
productSub: "20030107"
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"
vendor: "Google Inc."
vendorSub: ""

Ответ 3

var browser = {
        chrome: false,
        mozilla: false,
        opera: false,
        msie: false,
        safari: false
    };
    var 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.log(browser.msie);

Ответ 4

Поместите этот код на свой сайт (например, файл js или после кода jQuery...):

var matched, browser;

// Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
jQuery.uaMatch = function( ua ) {
    ua = ua.toLowerCase();

    var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
        /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
        /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
        /(msie) ([\w.]+)/.exec( ua ) ||
        ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
        [];

    return {
        browser: match[ 1 ] || "",
        version: match[ 2 ] || "0"
    };
};

matched = jQuery.uaMatch( navigator.userAgent );
browser = {};

if ( matched.browser ) {
    browser[ matched.browser ] = true;
    browser.version = matched.version;
}

// Chrome is Webkit, but Webkit is also Safari.
if ( browser.chrome ) {
    browser.webkit = true;
} else if ( browser.webkit ) {
    browser.safari = true;
}

jQuery.browser = browser;

Ответ 5

Я использовал следующий код, когда попал в ту же проблему:

<script type="text/javascript">
 $(document).ready(function() {
    //if (!$.browser.webkit && ! $.browser.mozilla) { //depricated
    if (!navigator.userAgent.match(/mozilla/i) && 
        ! navigator.userAgent.match(/webkit/i) ){
        alert('Let me tell you about Mozilla');
    }
 });
</script>

Ответ 6

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

Вы действительно не должны включать jquery из CDN без указания номера версии в любом случае, это в какой-то мере побеждает цель использования CDN (без кэширования).

Вот ссылка на последнюю версию jQuery, которая поддерживала $.browser:

http://code.jquery.com/jquery-1.8.3.min.js

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

Примечание. Fancybox2 по-прежнему использует $.browser, самый распространенный из них, который я видел до сих пор с момента обновления.

Обновление: Slickgrid по-прежнему использует $.browser, обновление от 02/11/2013

Ответ 7

Я отвлек логику от jQuery.browser в плагин jquery.browser. Плагин выпущен под лицензией MIT.

Я также добавил поддержку IE11, Opera Webkit и Android.

Ответ 8

Попробуйте Conditionizr

Надеюсь, что это поможет:)

Ответ 9

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

10 or older document.all
9 or older  document.all && !window.atob
8 or older  document.all && !document.addEventListener
7 or older  document.all && !document.querySelector
6 or older  document.all && !window.XMLHttpRequest
5.x document.all && !document.compatMode

if (document.all && !document.querySelector) {
    alert('IE7 or lower');
}

Эти тесты не позволяют использовать userAgent, который используется для подмены

Ответ 10

if(!$.browser){
    $.browser={chrome:false,mozilla:false,opera:false,msie:false,safari:false};
    var ua=navigator.userAgent;
        $.each($.browser,function(c,a){
        $.browser[c]=((new RegExp(c,'i').test(ua)))?true:false;
            if($.browser.mozilla && c =='mozilla'){$.browser.mozilla=((new RegExp('firefox','i').test(ua)))?true:false;};
            if($.browser.chrome && c =='safari'){$.browser.safari=false;};
        });
};

http://jsfiddle.net/R3AAX/3/

Ответ 11

Если все, что вам нужно, это ваши сторонние плагины jQuery, чтобы иметь возможность использовать jQuery.browser.msie, здесь однострочный. Просто включите его после jQuery.

jQuery.browser = jQuery.browser || {msie: navigator.userAgent.match(/msie/i) ? true : false};

Это самое малое возможное исправление, но все, что мне нужно, и оно работает, поэтому вы идете!

Ответ 12

Чтобы добавить к этому обсуждению. Я просто придумал плагин jquery $.browser, который вместо "обнаружения" просто просто анализирует агент пользователя в простой в использовании объект. Дальнейшая логика может быть легко применена для дальнейшего разбиения и анализа отдельных браузеров и платформ.

У меня были очень надежные результаты по useragents found здесь: UserAgentString.com. Я даже включил обнаружение версии для ie11 (около дна).

//The following code is by no means perfect, nor is it meant to be a standalone 'detection' plugin. 
//It demonstrates parsing the useragent string into an easy to manage object. 
//Even if it does make detection rediculously easy.. :)

//Because this regex makes no assumptions in advance.
//IMO, It compatibilty and maintainability is much higher than those based on static identifiers.

/*
  uaMatch replacement that parses a useragent string into an object
  useragent segments can be Name Value OR Name/Value OR Name

  Segment: Name Value
    Name: parsed to the last whitespace character
    Value: value after the last whitespace character
    Matches: (.NET CLR) (#.##), Android 2.3.4, etc
    Note: this regex can have leading/trailing whitespace (trimmed for object properties)

  Segment: Name/Value
    Matches: all values matching Name/Value
    Example: Firefox/24.0, Safari/533.1, Version/12.1, etc

  Segment: Name
    Matches: identifiers that hold no values (value of 'true' is implied)
    Example: Macintosh, Linux, Windows, KHTML, U, etc


   WARNING: not necessarily compatible with jQuery $.browser implementation.
   - not recommended as a replacement for plugins that require it to function.
*/
(function ($) {

    var ua = navigator.userAgent.toLowerCase();

    var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g;
    var match = regex.exec(ua);

    var browser = { };

    while (match != null) {
        var prop = {};

        if (match[1]) {
          prop.type = match[1];
          prop.version = match[2];
        }
        else if (match[3]) {
          prop.type = match[3];
          prop.version = match[4];
        }
        else {
          prop.type = match[5];
        }

        // some expressions have leading whitespace (i couldn't avoid this without a more complex expression)
        // trim them and get rid of '.' (' .NET CLR' = 'net_clr') 
        prop.type = $.trim(prop.type).replace(".","").replace(" ","_"); 
        var value = prop.version ? prop.version : true;

        if (browser[prop.type]) {
            if (!$.isArray(browser[prop.type]))
                browser[prop.type] = new Array(browser[prop.type]);

            browser[prop.type].push(value);
        }    
        else browser[prop.type] = value;

        match = regex.exec(ua);
    }

    for (var i in browser)
        if (i.indexOf("mac") > -1)
            browser.mac = true;

    if (browser.windows_nt && !browser.windows)
        browser.windows = true;

    //put known browsers into the 'version' property for 'some' jquery compatibility

    //for sake of argument chromium 'is' chrome
    if (browser.chromium && !browser.chrome)
        browser.chrome = browser.chromium;

    //chrome / safari / webkit
    if (browser.chrome) {
        browser.version = browser.chrome;
    }
    else if (browser.safari) {
        browser.version = browser.safari;
    }
    else {
        if (browser.applewebkit)
            browser.webkit = browser.applewebkit;

        if (browser.webkit)
            browser.version = browser.webkit;
    }

    //firefox / gecko
    if (browser.firefox) {
        if (browser.rv)
            browser.version = browser.rv;

        else browser.version = browser.firefox;
    }
    else if (browser.gecko) {
        if (browser.rv)
            browser.version = browser.rv;

        else browser.version = browser.gecko;
    }

    //opera
    if (browser.opera && !browser.version)
        browser.version = browser.opera;

    //msie
    if (browser.trident && browser.rv) //ie11
        browser.msie = browser.rv;

    if (browser.msie)
        browser.version = browser.msie;

    $.browser = browser;//Rename to reduce confliction?

    //WAS USED FOR TESTING & DISCOVERY (very useful)
    //TODO: remove line below
    alert(JSON.stringify($.browser));

}) (jQuery);

В Internet Explorer 10 JSON.stringify выйдет примерно так:

{"mozilla":"5.0","msie":"10.0","windows_nt":"6.2","trident":"6.0","net4.0e":true,"net4.0c":true,"net_clr":["3.5.30729","2.0.50727","3.0.30729"],"windows":true,"version":"10.0"}

Ответ 13

Короткий и вместе с тем мощный.

// chrome, safari, webkit, mozilla, msie, opera
var chrome = /chrome/i.test(navigator.userAgent);