Hier, plusieurs clients se sont plaints du fait que certains codes avaient cessé de fonctionner. Apparemment, cela revient aux plug-ins utilisant le désormais obsolète jQuery.browser
, Qui a cessé de fonctionner hier lorsque jQuery 1.9 a été publié.
J'ai (rapidement) examiné les documents de modification 1.9 et il me semble qu'ils veulent que je substitue des bibliothèques assez lourdes rien que pour cela ne fonction.
Existe-t-il un plug-in ou un extrait de code ultra léger recommandé pour restaurer cette fonctionnalité?
Pour ce dont ces sites ont besoin, c'est très basique; Je n'ai besoin que de la détection la plus élémentaire de IE vs FF vs tous les autres.
Suggestions?
J'ai utilisé le code suivant répondu par Alexx Roche, mais je voulais détecter MSIE de manière:
<script type="text/javascript">
$(document).ready(function() {
if (navigator.userAgent.match(/msie/i) ){
alert('I am an old fashioned Internet Explorer');
}
});
</script>
j'espère que ça aide!
jQuery Migrate était créé pour permettre la compatibilité ascendante pendant la mise à jour de votre code.
https://github.com/jquery/jquery-migrate
En prime, il enregistre les fonctions obsolètes lorsque vous les utilisez. Je voudrais essayer pendant que vous résolvez les problèmes. En outre, vous devez définir une version spécifique de jQuery pour vos sites. C'est bien de mettre à jour, mais assurez-vous de tester ces mises à jour avant de les mettre en production. Si vous utilisez un CDN, vous pouvez toujours spécifier une version spécifique dans le nom du fichier.
Maintenant, vous n'avez pas besoin d'un plugin jQuery pour ce que vous demandez. Départ l'objet 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: ""
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);
Mettez ce code dans votre site (comme un fichier js ou après le code de 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;
J'ai utilisé le code suivant lorsque je rencontre le même problème:
<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>
Vous pouvez simplement ne pas mettre à jour tant que vous n’abandonnez pas les méthodes amorties.
Vous ne devriez vraiment pas inclure jquery à partir d'un CDN sans spécifier de toute façon un numéro de version, car cela irait à l'encontre de l'objectif d'utiliser un CDN (pas de cache).
Voici un lien vers la dernière version de jQuery prenant en charge $ .browser:
http://code.jquery.com/jquery-1.8.3.min.js
remplacez simplement votre src jquery.js par ce lien et votre code continuera à s'exécuter jusqu'à ce que vous soyez prêt à avancer et à cesser d'utiliser les fonctionnalités amorties.
Remarque: Fancybox2 utilise toujours $ .browser, c'est le fichier le plus courant que j'ai vu depuis la mise à jour.
Mise à jour: Slickgrid utilise toujours $.browser
, pas de mise à jour au 02/11/2013
J'ai résumé la logique de jQuery.browser dans un plugin jquery.browser . Le plugin est publié sous la licence MIT).
J'ai également ajouté le support pour IE11, Opera Webkit et Android détection.
Essayez Conditionizr
J'espère que cela t'aides :)
La version exacte de IE peut être détectée par une vérification supplémentaire de l'existence d'objets globaux standard ajoutés dans des versions spécifiques 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');
}
Ces tests évitent d’utiliser l’agent d’utilisation utilisé pour l’usurpation
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;};
});
};
Court et pourtant puissant.
// chrome, safari, webkit, mozilla, msie, opera
var chrome = /chrome/i.test(navigator.userAgent);
Si tout ce que vous voulez, c'est que vos plugins jQuery tiers puissent utiliser jQuery.browser.msie, voici un one-liner. Il suffit de l'inclure après jQuery.
jQuery.browser = jQuery.browser || {msie: navigator.userAgent.match(/msie/i) ? true : false};
C’est la solution la plus stupide possible, mais c’est tout ce dont j’avais besoin, et ça marche, alors voilà!
Pour ajouter à cette discussion. Je viens juste de créer un plugin jquery $ .browser qui, au lieu de "détection", analyse simplement l'agent utilisateur en un objet facile à utiliser. Une logique supplémentaire peut facilement être appliquée pour décomposer et analyser davantage des navigateurs et des plates-formes spécifiques.
J'ai eu des résultats très fiables sur les useragents trouvés ici: UserAgentString.com . J'ai même inclus la détection de version pour ie11 (près du bas).
//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);
Sur Internet Explorer 10, JSON.stringify produira quelque chose comme ceci:
{"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"}