support - El reemplazo más fácil/más ligero para la detección del navegador jQuery 1.9?
jquery.browser is deprecated (13)
Ayer, varios clientes se quejaron de que algún código dejó de funcionar. Aparentemente, se trata de complementos que usan el jQuery.browser
ahora en desuso, que dejó de funcionar ayer cuando se lanzó jQuery 1.9.
Miré (rápidamente) los documentos de cambio de 1.9 y parece que quieren que sustituya algunas bibliotecas pesadas para esa función.
¿Existe un complemento o fragmento de código de peso ligero recomendado para restablecer esa funcionalidad?
Por lo que estos sitios necesitan, es muy básico; Solo necesito la detección más básica de IE vs FF frente a todos los demás.
Sugerencias?
Coloque este código en su sitio (como el archivo js, o después del código 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;
Corto y sin embargo Poderoso.
// chrome, safari, webkit, mozilla, msie, opera
var chrome = /chrome/i.test(navigator.userAgent);
Extraje la lógica de jQuery.browser en un complemento jquery.browser . El complemento se libera bajo la licencia de MIT.
También agregué compatibilidad con IE11, Opera Webkit y detección de Android.
He usado el siguiente código cuando hago clic en el mismo problema:
<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>
He usado el siguiente código respondido por Alexx Roche, pero quería detectar MSIE así:
<script type="text/javascript">
$(document).ready(function() {
if (navigator.userAgent.match(/msie/i) ){
alert(''I am an old fashioned Internet Explorer'');
}
});
</script>
¡Espero eso ayude!
La versión exacta de IE se puede detectar mediante la comprobación adicional de la existencia de objetos globales estándar agregados en versiones específicas de 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'');
}
Estas pruebas evitan el uso del userAgent que se usa para suplantación de identidad
Para agregar a esta discusión. Acabo de crear un plugin jquery $ .browser que, en lugar de ''detección'', simplemente analiza el agente de usuario en un objeto fácil de usar. Se puede aplicar fácilmente otra lógica para desglosar y analizar navegadores y plataformas específicos.
He obtenido resultados muy confiables sobre los usuarios de usuarios que se encuentran aquí: UserAgentString.com . Incluso incluí la detección de versión para ie11 (cerca de la parte inferior).
//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);
En Internet Explorer 10, JSON.stringify superará algo como esto:
{"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"}
Prueba Conditionizr
Espero que esto ayude :)
Si todo lo que desea es que sus plugins de jQuery de terceros puedan usar jQuery.browser.msie, aquí hay un proyecto de una sola línea. Solo inclúyelo después de jQuery.
jQuery.browser = jQuery.browser || {msie: navigator.userAgent.match(/msie/i) ? true : false};
Esta es la solución más estúpida posible, pero es todo lo que necesitaba, y funciona, ¡aquí tienes!
Simplemente no puede actualizar hasta que se aleje de los métodos depreciados.
Realmente no debería incluir jquery de un CDN sin especificar un número de versión de todos modos, de alguna manera se frustra el propósito de usar un CDN (sin cacheo).
Aquí hay un enlace a la última versión de jQuery que admite $ .browser:
http://code.jquery.com/jquery-1.8.3.min.js
simplemente reemplace su jquery.js src con ese enlace y su código continuará ejecutándose hasta que esté listo para seguir adelante y dejar de usar funciones depreciadas.
Nota: Fancybox2 todavía usa $ .browser, ese es el más común que he visto hasta ahora desde la actualización.
Actualización: Slickgrid todavía está usando $.browser
, no hay actualizaciones a partir del 02/11/2013
jQuery Migrate se creó para permitir la compatibilidad con versiones anteriores mientras actualiza su código.
https://github.com/jquery/jquery-migrate
Como beneficio adicional, registra las funciones obsoletas a medida que las usa. Lo probaría mientras resuelves los problemas. Además, debe establecer una versión específica de jQuery para sus sitios. Es bueno actualizar, pero asegúrese de probar esas actualizaciones antes de ponerlas en producción. Si está utilizando una CDN, aún puede especificar una versión específica en el nombre del archivo.
Ahora, no necesita un complemento jQuery para lo que está pidiendo. Mira el objeto 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: ""
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;};
});
};
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);