Ist jQuery $ .browser veraltet?

77

Kann mir jemand sagen, ob ich zu Recht glaube, dass der $ .browser von jQuery veraltet ist / war?

Funktionieren meine vorhandenen Implementierungen weiterhin? Wenn nicht, gibt es eine einfach zu implementierende Alternative.

Mark_54
quelle
api.jquery.com/jQuery.browser Kategorie: veraltet.
Evan Mulawski
13
Warum wurde dies notiert? Für manche mag es eine triviale Frage sein, aber wenn ich keine Alternative kenne, ist es eine gültige Frage.
Mark_54
3
Oder fügen Sie einfach das Plugin hinzu: github.com/gabceb/jquery-browser-plugin
user956584

Antworten:

70

Aus der Dokumentation :

Die $ .browser-Eigenschaft ist in jQuery 1.3 veraltet, und ihre Funktionalität kann in einer zukünftigen Version von jQuery auf ein vom Team unterstütztes Plugin verschoben werden.

Ja, es ist veraltet, aber Ihre vorhandenen Implementierungen funktionieren weiterhin. Wenn die Funktionalität entfernt wird, ist sie wahrscheinlich über ein Plugin leicht zugänglich.

Ob es eine Alternative gibt ... Die Antwort lautet "Ja, wahrscheinlich". Es ist weitaus besser, die Funktionserkennung mithilfe der $.supportBrowsererkennung durchzuführen: Erkennen Sie die tatsächlich benötigte Funktion, nicht den Browser, der sie bereitstellt. Damit werden die wichtigsten Funktionen erkannt, die von Browser zu Browser unterschiedlich sind.


Update 16. Februar 2013: In jQuery 1.9 wurde diese Funktion entfernt ( docs ). Es ist weitaus besser, es nicht zu benutzen. Wenn Sie die Funktionalität wirklich, wirklich nutzen müssen , können Sie sie mit dem jQuery Migrate- Plugin wiederherstellen .

einsamer Tag
quelle
4
Das Problem $.supportist, wie erkenne ich, ob ich IE 7 verwende und daher CSS-Optimierungen hinzufügen muss, um meine Seite zu reparieren?
Rocket Hazmat
5
@ Rocket Bedingte Kommentare wären sicherlich besser.
einsamer
1
lonesomeday - Vielen Dank für diesen zusätzlichen Kommentar. Wir alle versuchen unser Wissen aufzubauen und brauchen manchmal Hilfe.
Mark_54
6
und $.browserwurde entfernt vonjQuery 1.9
diEcho
6
Es gibt so viele Macken mit IE und verschiedenen IE-Versionen. Ja, IE 7 unterstützt Animationen, aber NEIN Ich möchte nicht, dass meine Benutzer es sehen! Es ist schrecklich. $ .Browser ist in diesem Fall also wirklich praktisch.
Elger Mensonides
94

Zweite Frage

Funktionieren meine vorhandenen Implementierungen weiterhin? Wenn nicht, gibt es eine einfach zu implementierende Alternative.

Die Antwort lautet ja , aber nicht ohne ein wenig Arbeit.

$ .browser ist ein offizielles Plugin, das in älteren Versionen von jQuery enthalten war. Wie bei jedem Plugin können Sie es einfach kopieren und in Ihr Projekt integrieren oder einfach am Ende jeder jQuery-Version hinzufügen.

Ich habe den Code für Sie extrahiert, falls Sie ihn verwenden möchten.


// Limit scope pollution from any deprecated API
(function() {

    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;

    jQuery.sub = function() {
        function jQuerySub( selector, context ) {
            return new jQuerySub.fn.init( selector, context );
        }
        jQuery.extend( true, jQuerySub, this );
        jQuerySub.superclass = this;
        jQuerySub.fn = jQuerySub.prototype = this();
        jQuerySub.fn.constructor = jQuerySub;
        jQuerySub.sub = this.sub;
        jQuerySub.fn.init = function init( selector, context ) {
            if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
                context = jQuerySub( context );
            }

            return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
        return jQuerySub;
    };

})();

Wenn Sie fragen, warum jemand ein abgeschriebenes Plugin benötigt, habe ich die folgende Antwort vorbereitet.

In erster Linie lautet die Antwort Kompatibilität. Da jQuery Plugin-basiert ist, haben sich einige Entwickler für die Verwendung von $ .browser entschieden. Mit den neuesten Versionen von jQuery, die $ .browser nicht enthalten, wurden alle diese Plugins unbrauchbar gemacht.

jQuery hat ein Migrations-Plugin veröffentlicht , das für Entwickler erstellt wurde, um festzustellen, ob ihre Plugins veraltete Abhängigkeiten wie $ .browser verwendet haben.

Obwohl dies Entwicklern geholfen hat, ihre Plugins zu patchen. jQuery hat $ .browser vollständig gelöscht, sodass das obige Update wahrscheinlich die einzige Lösung ist, bis Ihre Entwickler das oben genannte Patches oder Integrationsprogramm verwenden.

Info: jQuery.browser

EminezArtus
quelle
7
Dies half mir, ein Skript eines Drittanbieters zu erhalten, das immer noch $ .browser für die Arbeit mit jQuery 1.9.0 verwendete. Vielen Dank!
Twamley
2
Ich habe eine offiziellere Version dieser (und anderer veralteter) Funktionen hier gefunden: github.com/jquery/jquery-migrate
twamley
2
Das Migrations-Plugin ist ein gutes Tool, mit dem Benutzer eine Liste veralteter Funktionen anzeigen können, sofern diese in den Skripten vorhanden sind. Es bietet Funktionen für veraltete Funktionen. Nicht als Patch gedacht.
EminezArtus
1
Einverstanden. Ich habe mich seitdem entschlossen, bei 1.8.3 zu bleiben, während ich auf die nächste Generation des Skripts von Drittanbietern warte.
Twamley
1
+1, es gibt Fehler in Dingen wie dem placeholderAttribut bis zum IE10, mit denen wir uns befassen müssen und die wir dafür benötigen $.browser...
Izkata
6

Hier präsentiere ich eine alternative Möglichkeit, einen Browser basierend auf der Verfügbarkeit von Funktionen zu erkennen.

Um nur IE zu erkennen, können Sie Folgendes verwenden:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE>=4 (unreliable for IE11)
}
else
{
    //You are using other browser
}

So erkennen Sie die beliebtesten Browser:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE >= 4 (unreliable for IE11!!!)
}
else if(window.chrome)
{
    //You are using Chrome or Chromium
}
else if(window.opera)
{
    //You are using Opera >= 9.2
}
else if('MozBoxSizing' in document.body.style)
{
    //You are using Firefox or Firefox based >= 3.2
}
else if({}.toString.call(window.HTMLElement).indexOf('Constructor')+1)
{
    //You are using Safari >= 3.1
}
else
{
    //Unknown
}

Diese Antwort wurde aktualisiert, da IE11 die bedingte Kompilierung (der /*@cc_on!@*/falseTrick) nicht mehr unterstützt .
Sie können überprüfen, ob IE11 die bedingte Javascript-Kompilierung entfernt hat. Weitere Informationen zu diesem Thema.
Ich habe den dort vorgelegten Vorschlag verwendet.
Alternativ können Sie typeof document.body.style.msTransform == "string"oder document.body.style.msTransform !== window.undefinedoder sogar verwenden 'msTransform' in document.body.style.

Ismael Miguel
quelle
Vielen Dank für das Teilen. Mein Date Picker funktionierte nicht, nachdem ich auf VS2013 aktualisiert und Jquery and Juice vom Nuget Package Manager heruntergeladen hatte. Fügte den Code ein und alles funktionierte wieder.
user1270384
2
Bitte schön. Ich verwende diesen Code, um alle Browser in Randfällen mit einigen meiner Javascript-Codes zu behandeln. Wenn dies nicht mehr funktioniert und Sie es feststellen, teilen Sie es mir bitte so bald wie möglich mit.
Ismael Miguel
/ * @ cc_on! @ * / false gibt false für IE Edge zurück
Alex
@alex Welche genaue Version und Build verwenden Sie und in welchem ​​Betriebssystem? Wenn Sie eine virtuelle Maschine verwenden, können Sie bitte die Software und die Version angeben?
Ismael Miguel
1
@alex Sorry die Verzögerung. Ich habe die Antwort jetzt korrigiert. IE wirklich vermasselt. Aber ich habe es geschafft. Sagen Sie mir bitte, was Sie denken.
Ismael Miguel
3

Aktualisiert! 24.03.2015 (Bildlauf unter Stunde)

Die Antwort von lonesomeday ist absolut richtig. Ich dachte nur, ich würde diesen Leckerbissen hinzufügen. Ich hatte vor einiger Zeit eine Methode entwickelt, um einen Browser in Vanilla JS zu erhalten, und sie schließlich gebogen, um sie jQuery.browserin späteren Versionen von jQuery zu ersetzen . Es stört keinen Teil der neuen jQuery-Bibliothek, bietet jedoch die gleiche Funktionalität wie das herkömmliche jQuery.browserObjekt sowie einige andere kleine Funktionen.


Neue erweiterte Version!

Ist für neuere Browser viel gründlicher. Auch 90 +% Genauigkeit beim mobilen Testen! Ich werde nicht 100% sagen, da ich nicht in jedem mobilen Browser getestet habe, aber die neue Funktion fügt $.browser.mobileBoolean / String hinzu. Es ist falsch, wenn es nicht mobil ist, andernfalls ist es ein String-Name für das mobile Gerät oder den Browser (beste Vermutungen wie: Android, RIM Tablet, iPod usw.).

Eine mögliche Einschränkung ist, dass einige ältere (nicht unterstützte) Browser möglicherweise nicht funktionieren, da sie vollständig von userAgentZeichenfolgen abhängig sind .

JS minimiert

/* quick & easy cut & paste */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* quick & easy cut & paste */

jsFiddle "jQuery Plugin: Browser abrufen (Extended Alt Edition)"

/**	jQuery.browser
 *	@author	J.D. McKinstry (2014)
 *	@description	Made to replicate older jQuery.browser command in jQuery versions 1.9+
 *	@see http://jsfiddle.net/SpYk3/wsqfbe4s/
 *
 *	@extends	jQuery
 *	@namespace	jQuery.browser
 *	@example	jQuery.browser.browser == 'browserNameInLowerCase'
 *	@example	jQuery.browser.version
 *	@example	jQuery.browser.mobile	@returns	BOOLEAN
 *	@example	jQuery.browser['browserNameInLowerCase']
 *	@example	jQuery.browser.chrome	@returns	BOOLEAN
 *	@example	jQuery.browser.safari	@returns	BOOLEAN
 *	@example	jQuery.browser.opera	@returns	BOOLEAN
 *	@example	jQuery.browser.msie	@returns	BOOLEAN
 *	@example	jQuery.browser.mozilla	@returns	BOOLEAN
 *	@example	jQuery.browser.webkit	@returns	BOOLEAN
 *	@example	jQuery.browser.ua	@returns	navigator.userAgent String
 */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* - - - - - - - - - - - - - - - - - - - */

var b = $.browser;
console.log($.browser);    //    see console, working example of jQuery Plugin
console.log($.browser.chrome);

for (var x in b) {
    if (x != 'init')
        $('<tr />').append(
            $('<th />', { text: x }),
            $('<td />', { text: b[x] })
        ).appendTo($('table'));
}
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
th { text-align: right; }

textarea { height: 500px; width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>

SpYk3HH
quelle
3

"Die $ .browser-Eigenschaft ist in jQuery 1.3 veraltet und ihre Funktionalität wird möglicherweise in einer zukünftigen Version von jQuery auf ein vom Team unterstütztes Plugin verschoben."

Von http://api.jquery.com/jQuery.browser/

Gabriel Santos
quelle
3
$.browserwird in v1.9
Dzhuneyt
0

Aus der offiziellen Dokumentation unter http://api.jquery.com/jQuery.browser/ :

Diese Eigenschaft wurde in jQuery 1.9 entfernt und ist nur über das Plugin jQuery.migrate verfügbar.

Sie können beispielsweise jquery-migrate-1.4.1.jsIhren vorhandenen Code oder Plugins, die $ .browser verwenden, weiterhin verwenden, während Sie einen Weg finden, $ .browser in Zukunft vollständig aus Ihrem Code zu entfernen.

Jaime Montoya
quelle