2013-02-15 7 views
47

Io uso il seguente snip di uno script:errore browser.msie dopo l'aggiornamento a jQuery 1.9.1

if ($.browser.msie && $.browser.version < 9) { 
    extra = "?" + Math.floor(Math.random() * 3000); 
} 

Funziona con jQuery 1.8.3.

Ora ho aggiornato jQuery alla nuova versione 1.9.1 per utilizzare un nuovo script.
Ora ottengo il seguente errore:

TypeError: Cannot read property 'msie' of undefined

ho letto il registro delle modifiche della nuova versione di jQuery, ma nulla avrebbe dovuto cambiare
con MSIE

eventuali bug noti, consigli o proposte?

+6

$ .browser è stato rimosso in 1.9: http://jquery.com/upgrade-guide/1.9/#jquery-browser-removed –

+0

Se si verifica un errore del tipo 'Impossibile leggere la proprietà' msie 'di undefined', guarda a cosa sta dicendo non è definito, che sarà il genitore della proprietà illeggibile – DrCord

+0

C'è una soluzione non jQuery che paga riguardo al fatto che le versioni recenti di IE avevano valori userAgent che non dicevano chiaramente che è IE: http://stackoverflow.com/a/21712356/2067690 – HumanInDisguise

risposta

36

$.browser è stata sconsigliata a versione 1.3 e rimossi in 1.9

È possibile verificare questo visualizzando la documentation.

+6

Utilizzo un plug-in con $ .browser.msie, sarebbe accettabile solo per evitare l'errore ?: $ .browser = {msie: (navigator.appName == 'Microsoft Internet Explorer ')? true: false} // questo ovviamente non tiene conto di altre possibilità, ma sembra correggere l'errore. –

+0

Soluzione piacevole (nel mio caso non avevo altra scelta, ma usare una soluzione alternativa) funziona perfettamente per me – Rotem

+0

È una soluzione gradevole, ma non riuscirai con IE11 in IE11 navigator.appName è 'Netscape', non 'Microsoft Internet Explorer ' – Hussam

13

Le opzioni jQuery.browser sono state ritirate in precedenza e rimosse nella versione 1.9 insieme a molti altri elementi deprecati come .live.

Per i progetti e le librerie esterne che desiderano eseguire l'aggiornamento alla versione 1.9 ma desiderano ancora supportare queste funzionalità, jQuery ha rilasciato un plug-in di migrazione per il momento.

Se è necessaria la compatibilità con le versioni precedenti, è possibile utilizzare migration plugin.

+0

Sembra che jQuery stia diventando bloatware. –

+11

Bloatware? In realtà sta cercando di essere il contrario. –

+0

[$ .browser] (http://jsfiddle.net/SpYk3/wsqfbe4s/show/) sostituzione – SpYk3HH

54

Da $ .Browser è deprecato, ecco una soluzione alternativa:

/** 
* Returns the version of Internet Explorer or a -1 
* (indicating the use of another browser). 
*/ 
function getInternetExplorerVersion() 
{ 
    var rv = -1; // Return value assumes failure. 

    if (navigator.appName == 'Microsoft Internet Explorer') 
    { 
     var ua = navigator.userAgent; 
     var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); 
     if (re.exec(ua) != null) 
      rv = parseFloat(RegExp.$1); 
    } 

    return rv; 
} 

function checkVersion() 
{ 
    var msg = "You're not using Internet Explorer."; 
    var ver = getInternetExplorerVersion(); 

    if (ver > -1) 
    { 
     if (ver >= 8.0) 
      msg = "You're using a recent copy of Internet Explorer." 
     else 
      msg = "You should upgrade your copy of Internet Explorer."; 
    } 

    alert(msg); 
} 

Source

Tuttavia, la ragione che la sua deprecato è perché jQuery vi vuole utilizzare feature detection invece.

Un esempio:

$("p").html("This frame uses the W3C box model: <span>" + 
     jQuery.support.boxModel + "</span>"); 

E, ultimo ma non meno importante, il modo più affidabile per verificare le versioni di IE:

// ---------------------------------------------------------- 
// A short snippet for detecting versions of IE in JavaScript 
// without resorting to user-agent sniffing 
// ---------------------------------------------------------- 
// If you're not in IE (or IE version is less than 5) then: 
//  ie === undefined 
// If you're in IE (>=5) then you can determine which version: 
//  ie === 7; // IE7 
// Thus, to detect IE: 
//  if (ie) {} 
// And to detect the version: 
//  ie === 6 // IE6 
//  ie > 7 // IE8, IE9 ... 
//  ie < 9 // Anything less than IE9 
// ---------------------------------------------------------- 

// UPDATE: Now using Live NodeList idea from @jdalton 

var ie = (function(){ 

    var undef, 
     v = 3, 
     div = document.createElement('div'), 
     all = div.getElementsByTagName('i'); 

    while (
     div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', 
     all[0] 
    ); 

    return v > 4 ? v : undef; 

}()); 
+4

Si risparmia molto tempo. Grazie;) – Simon

1

È possibile utilizzare:

var MSIE = jQuery.support.leadingWhitespace; // This property is not supported by ie 6-8 

$(document).ready(function(){ 

if (MSIE){ 
    if (navigator.vendor == 'Apple Computer, Inc.'){ 
     // some code for this navigator 
    } else { 
     // some code for others browsers 
    } 

} else { 
    // default code 

}}); 
+1

Non in IE8 con la modalità browser IE7. – jmav

2

Utilizzo:

se (navigator.userAgent.match ("MSIE")) {}

4

Update! Complete answer overhaul for new plugin!

Il seguente plugin è stato testato in tutti i principali browser. Fa uso tradizionale della stringa userAgent per riattrezzare jQuery.browsersolo se si utilizza jQuery versione 1.9 o superiore!

Ha le tradizionali proprietà del tipo jQuery.browser.msie e alcune nuove, inclusa la proprietà .mobile per aiutare a decidere se l'utente si trova su un dispositivo mobile.

Nota: Questo non è un sostituto adatto per il test di funzionalità. Se si prevede di supportare una caratteristica specifica su un dispositivo specifico, è ancora meglio usare test funzione tradizionale

/** \t jQuery.browser 
 
* \t @author \t J.D. McKinstry (2014) 
 
* \t @description \t Made to replicate older jQuery.browser command in jQuery versions 1.9+ 
 
* \t @see http://jsfiddle.net/SpYk3/wsqfbe4s/ 
 
* 
 
* \t @extends \t jQuery 
 
* \t @namespace \t jQuery.browser 
 
* \t @example \t jQuery.browser.browser == 'browserNameInLowerCase' 
 
* \t @example \t jQuery.browser.version 
 
* \t @example \t jQuery.browser.mobile \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser['browserNameInLowerCase'] 
 
* \t @example \t jQuery.browser.chrome \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.safari \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.opera \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.msie \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.mozilla \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.webkit \t @returns \t BOOLEAN 
 
* \t @example \t jQuery.browser.ua \t @returns \t navigator.userAgent String 
 
*/ 
 
;;(function($){var a=$.fn.jquery.split("."),b;for(b in a)a[b]=parseInt(a[b]);if(!$.browser&&(1<a[0]||9<=a[1])){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].match(/[0-9\.]{1,}/)[0])?parseFloat(a.ua.split("MSIE")[1].match(/[0-9\.]{1,}/)[0]): 
 
"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].match(/[0-9\.]{1,}/)[0]))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0])):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].match(/[0-9\.]{1,}/)[0])):/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].match(/[0-9\.]{1,}/)[0])):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0]))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].match(/[0-9\.]{1,}/)[0])):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0])): 
 
/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0])):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0])):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]{1,}/)[0])):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].match(/[0-9\.]{1,}/)[0])): 
 
/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].match(/[0-9\.]{1,}/)[0])));if(a.browser)for(var c in a.browserArray)a[a.browserArray[c].toLowerCase()]=a.browser==a.browserArray[c];$.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>

+0

posso ottenere questo codice non minorato da qualche parte? – micnic

+0

@micnic è non terminato sul mio server di casa e sarà su un sito nel prossimo futuro. sono al lavoro per ora, c'è un problema che hai trovato? – SpYk3HH

+0

sì, ho trovato un problema, rileva la versione IE9 e IE10 come 9.06 e 10.06 (IE11 è ok) – micnic

0

Invece di avere lo script di tutta la migrazione ha aggiunto, si potrebbe semplicemente aggiungere il seguente (estratto dallo script di migrazione)

$.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" 
    }; 
}; 

e quindi utilizzarlo in questo modo

$.uaMatch(navigator.userAgent) 
0

Ho avuto questo problema pure. Stavamo usando due versioni di Jquery (1.11.3 e 1.8.3), una delle quali stava causando questo problema. Ho trovato un rilascio lightbox_me.js che ha lavorato su entrambe le versioni:

http://buckwilson.me/lightboxme/

Era solo una facile sostituzione di un vecchio file.

Problemi correlati