Einfachste / leichteste Ersatz für Browser-Erkennung jQuery 1.9?



Answers

jQuery Migrate wurde erstellt, um die Rückwärtskompatibilität zu ermöglichen, während Sie Ihren Code aktualisieren.

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

Als Bonus protokolliert es veraltete Funktionen, während Sie sie verwenden. Ich würde es versuchen, während Sie die Probleme lösen. Außerdem sollten Sie eine bestimmte Version von jQuery für Ihre Websites festlegen. Es ist gut, ein Upgrade durchzuführen, aber stellen Sie sicher, dass Sie diese Upgrades testen, bevor Sie sie in Produktion nehmen. Wenn Sie ein CDN verwenden, können Sie im Dateinamen eine bestimmte Version angeben.

Jetzt brauchen Sie kein jQuery-Plugin für das, was Sie fragen. Sieh dir das navigator Objekt an .

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: ""
Question

Ich hatte gestern mehrere Kunden, die sich darüber beschweren, dass ein Code nicht mehr funktioniert. Offensichtlich kommt es auf Plug-Ins an, die den inzwischen veralteten jQuery.browser der gestern bei der Veröffentlichung von jQuery 1.9 nicht mehr funktionierte.

Ich habe (schnell) die 1.9-Änderungsdokumente angeschaut und es scheint, als ob sie wollen, dass ich einige ziemlich schwere Bibliotheken nur für diese eine Funktion ersetze.

Gibt es ein empfohlenes Plug-In oder Code-Snippet, um diese Funktionalität wiederherzustellen?

Für was diese Seiten brauchen, ist es sehr einfach; Ich brauche nur die grundlegendste Erkennung von IE vs FF gegen alle anderen.

Vorschläge?




Sie könnten einfach nicht aktualisieren, bis Sie sich von abgeschriebenen Methoden entfernen.

Sie sollten jquery aus einem CDN eigentlich nicht ohne Angabe einer Versionsnummer aufnehmen, da dies den Zweck der Verwendung eines CDN (kein Caching) in irgendeiner Weise vereitelt.

Hier ist ein Link zur neuesten Version von jQuery, die $ .browser unterstützt:

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

Ersetzen Sie einfach Ihre jquery.js src mit dieser Verknüpfung, und Ihr Code wird weiterhin ausgeführt, bis Sie bereit sind, die veralteten Funktionen zu verwenden.

Hinweis: Fancybox2 verwendet immer noch $ .browser, das ist das üblichste, das ich seit dem Update gesehen habe.

Update: Slickgrid verwendet immer noch $.browser , kein Update zum 11.02.2013




Setzen Sie diesen Code in Ihre Site (wie js-Datei oder nach dem Code von 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;



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/




Um zu dieser Diskussion hinzuzufügen. Ich habe gerade ein jquery $ .browser-Plugin entwickelt, das den Benutzeragenten einfach in ein einfach zu benutzendes Objekt zerlegt. Weitere Logik kann leicht angewendet werden, um bestimmte Browser und Plattformen weiter zu analysieren.

Ich habe sehr zuverlässige Ergebnisse über Benutzer gefunden hier gefunden : UserAgentString.com . Ich habe sogar die Versionserkennung für ie11 (unten) aufgenommen.

//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's 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's $.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);

In Internet Explorer 10 gibt JSON.stringify Folgendes aus:

{"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"}






Links