2011-01-17 16 views
66

Attualmente sto scrivendo un file JavaScript e hanno la seguente riga:oggetto JSON undefined in Internet Explorer 8

var res = "JSON=" + JSON.stringify(result); 

risultato è in corso di appena al di sopra di questa linea. Il problema che sto avendo è che IE8 (solo IE8, cioè) mi sta riferendo che JSON non è definito in qualche modo. Non sono sicuro di cosa fare da quando, come ho capito, IE8 è un browser che ha implementato il supporto JSON. Qualcuno ha idea di cosa potrebbe succedere?

+4

Sei in modalità di compatibilità? – SLaks

risposta

115

Assicurati di essere in realtà in modalità IE 8 utilizzando il metodo preferito, un doctype standard ...

<!DOCTYPE html> 

... o il metodo indesiderato, il X-UA-Compatible meta tag/intestazione ...

<meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> 

Vedere Defining Document Compatibility per ulteriori informazioni.

+9

Sicuramente vale la pena controllarlo, perché la modalità compat può essere attivata senza che tu te ne sia reso conto - apri gli Strumenti per sviluppatori (F12) e cerca nella barra degli strumenti la modalità browser. – Spudley

+2

Ho lasciato cadere questa linea e controllato gli strumenti di sviluppo. Sicuramente in esecuzione in modalità standard IE8. – keybored

+0

@keybored: qualcosa ** deve ** sovrascrivere quindi l'oggetto globale JSON. Controlla il tuo codice per le variazioni di 'JSON =' (il codice di esempio che hai scritto nella domanda è un buon inizio - stai usando 'eval'?). –

6

Altre cose che l'assenza di doctype o doctype errato, o qualche errore con la sintassi html, costringono IE ad usare modalità di documento diverse da quelle che ci si aspetta.

Stavo usando il semplice "" in un documento di prova e l'assenza del tag TITLE come figlio del tag HEAD fatto window.JSON diventa indefinito.

Ricordare sempre che è meglio testare la risorsa rispetto alla versione del browser. Inoltre, se gli utenti possono utilizzare IE con l'emulazione delle modalità documento, è meglio disporre di una parte di codice per fornire JSON.parse e JSON.stringify quando i nativi non sono definiti.

2

Può accadere nonostante <!DOCTYPE html> se la codifica della pagina è UTF-8 con BOM (byte di ordinamento). Prova a salvare il file come UTF-8 senza BOM, utilizzando un editor di testo adatto.

8

L'utilizzo di jQuery.parseJSON ha risolto questo problema per me, nel caso in cui si stia già utilizzando JQuery.

2
function parseJson(jsonString) { 
    if ($.browser.msie && $.browser.version < 8) { 
     return eval('(' + jsonString + ')'); 
    } 
    else { 
     return JSON.parse(jsonString); 
    } 
} 
+0

Questo non tenta nemmeno di rispondere alla domanda. –

-1

Controllare la versione jQuery. jQuery 2.0 drops support for IE 6, 7 and 8. Usa invece jQuery 1.x, che è ancora ufficialmente supportato. puoi usare questo codice.

<script src="http://code.jquery.com/jquery-1.9.0.js"></script> 
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script> 

Per saperne di più jquery migrate.

se non funziona controllare this article.

+2

L'OP non ha detto che sta usando jQuery, e anche se lo fosse, sta chiedendo del 'JSON' nativo che non fa parte di jQuery. Questa risposta è assolutamente irrilevante. –

0

inserire il seguente codice nel file js;

var JSON = JSON || {}; 

// implement JSON.stringify serialization 
JSON.stringify = JSON.stringify || function (obj) { 

var t = typeof (obj); 
if (t != "object" || obj === null) { 

    // simple data type 
    if (t == "string") obj = '"'+obj+'"'; 
    return String(obj); 

} 
else { 

    // recurse array or object 
    var n, v, json = [], arr = (obj && obj.constructor == Array); 

    for (n in obj) { 
     v = obj[n]; t = typeof(v); 

     if (t == "string") v = '"'+v+'"'; 
     else if (t == "object" && v !== null) v = JSON.stringify(v); 

     json.push((arr ? "" : '"' + n + '":') + String(v)); 
    } 

    return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); 
} 
}; 

// implement JSON.parse de-serialization 
JSON.parse = JSON.parse || function (str) { 
if (str === "") str = '""'; 
eval("var p=" + str + ";"); 
return p; 
}; 
+2

Lasciando da parte la mancanza di qualsiasi tentativo di rispondere effettivamente alla * domanda *, questo è un codice terribile. Oltre ai nomi variabili di una lettera opaca, alla formattazione interrotta e al ricorso a "eval" per l'analisi, il kicker è che l'addetto alla verifica non funziona nemmeno; restituisce il risultato errato per qualsiasi stringa contenente una virgola doppia, una nuova riga, una barra rovesciata o probabilmente molte altre cose. –

-1

Nel mio caso l'errore non definito era perché mi mancava una libreria JSON.

È possibile aggiungere oggetto JSON come questo (sostituire il percorso relativo con il proprio percorso):

<script> 
     if (typeof window.JSON == 'undefined') { 
      document.write('<script src="../scripts/json2.js"><\/script>'); 
     } 
</script> 

Per biblioteca json2: http://cdnjs.com/libraries/json2/

C'è anche una biblioteca json3: http://cdnjs.com/libraries/json3/

Quindi puoi fare riferimento ad esso nel tuo codice:

var array = []; 
array[1] = "apple"; 
array[2] = "orange"; 
alert(JSON.stringify(array)); 
Problemi correlati