TL; DR: L'aggiunta di qualsiasi funzione non incorporata in Array.prototype AND Function.prototype farà sì che il parser JSON nativo IE8 ottenga uno stack overflow durante l'analisi di qualsiasi JSON che contiene un array, ma solo quando si passa anche una funzione Reviver in JSON.parse().IE8 nativo JSON.parse bug causa overflow dello stack
Questa iniziato come una domanda, ma ho risposto alla mia domanda iniziale, quindi ora mi chiedo: qualcuno può pensare a un work-around per questo bug IE8 che non coinvolge eliminando tutte le librerie JS che modificano Array.prototype e Function.prototype?
domanda originale:
ho circa 13k dei dati JSON da analizzare. La struttura dei dati è un oggetto con un singolo valore che è una matrice nidificata.
{ 'value':[[ stuff ], [ more stuff], [ etc ]] }
Sto utilizzando json2.js, che rimanda al browser nativo JSON.parse quando disponibile. Sto passando una funzione di reviver in JSON.parse per gestire correttamente le date. Quando IE8 è in modalità di emulazione IE7 (che fa sì che utilizzi il parser json2.js basato su script) tutto funziona correttamente. Quando IE8 è in modalità IE8 (che fa sì che utilizzi il parser JSON nativo del browser) si verifica un errore "out of stack space". Firefox e Chrome, ovviamente, funzionano bene con i loro parser JSON nativi del browser.
L'ho ristretto a questo: se passo in JSON.parse anche una funzione revisore del nulla fare, il parser nativo IE8 ottiene lo stack overflow. Se non passo in nessuna funzione di reviver, il parser nativo IE8 funziona bene, tranne che non analizza correttamente le date.
// no error:
JSON.parse(stuff);
// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });
ho intenzione di giocare con i miei dati JSON, per vedere se meno dati o meno nidificazione dei dati possono evitare l'errore, ma mi chiedevo se qualcuno avesse visto prima, o ha avuto qualsiasi altro suggerito work-around. IE8 è già abbastanza lento, sarebbe un peccato disabilitare il JSON nativo per quel browser a causa di questo bug.
AGGIORNAMENTO: in altri casi, con dati JSON diversi, viene visualizzato un errore javascript "$ lineinfo non definito" quando utilizzo il parser IE8 nativo con una funzione reviver e nessun errore se non utilizzo alcuna funzione reviver. La stringa "$ lineinfo" non appare in nessuna parte del mio codice sorgente.
UPDATE 2: In realtà, questo problema sembra essere causato da Prototype 1.6.0.3. Non sono riuscito a riprodurlo in una pagina di test isolata finché non ho aggiunto la libreria Prototype.
UPDATE 3:
I prototype.js ragione rompe l'IE8 nativo parser JSON è questo: L'aggiunta di qualsiasi non-built-in per l'Array.prototype E Function.prototype causerà l'IE8 nativo parser JSON per ottenere un overflow dello stack durante l'analisi di qualsiasi JSON che contiene un array, ma solo quando si passa anche una funzione Reviver in JSON.parse().
La libreria Prototype aggiunge funzioni a Array.prototype e Function.prototype, ma ciò vale anche per qualsiasi altra libreria che fa la stessa cosa. Questo bug nel parser JSON di IE è esposto da Prototype ed Ext, ma non da jQuery. Non ho testato nessun altro framework.
Ecco una riproduzione completamente autonoma del problema. Se si rimuove la riga Function.prototype o la riga Array.prototype o si rimuove l'array dalla stringa JSON, non si otterrà l'errore "out of stack space".
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };
window.onload = function()
{
alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}
</script>
</head>
<body>
</body>
</html>
Il team JavaScript segnala che si tratta di un problema noto nel motore JavaScript. Grazie. – EricLaw
Grazie per avermelo fatto sapere. –