2009-06-30 4 views
5

Utilizzando ExtJS 2.2.1, ho un elemento contenitore che dovrebbe caricare un pezzo di codice HTML dal server utilizzando:ExtJS: autoLoad non funziona in IE

autoLoad: { url: 'someurl' } 

Questo funziona bene in Firefox , ma per IE7 questo si traduce in un errore di sintassi in ext-all-debug.js alla riga 7170:

this.decode = function(json){ 
    return eval("(" + json + ')'); 
}; 

ho fissato questo trasformando tale funzione in questo:

this.decode = function(json){ 
    return eval('(function(){ return json; })()'); 
}; 

Quindi il AutoLoad funziona bene in entrambi i browser, ma poi ci sono alcuni bug strani e inoltre, davvero non si vuole sistemarlo nella libreria ExtJS in quanto non è possibile tenerlo (specialmente nel file ext-all.js minificato che è come mezzo megabye di javascript su una singola riga).

Non sono stato in grado di trovare molto su questo bug.

Variazioni che ho provato:

// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: true } 
// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: false } 

e viceversa senza le <script> tags. Non c'è alcun Javascript nel codice HTML, ma dovrebbe essere possibile, perché alla fine utilizzeremo Javascript nel codice HTML restituito.

Il problema non è nell'HTML perché anche con l'HTML più semplice possibile, l'errore è lo stesso.

UPDATE - Risposta a Donovan:

Il caso più semplice in cui questo è usato è questo:

changeRolesForm = new Ext.Panel({ 
     height: 600, 
     items: [{ autoScroll: true, autoLoad: WMS.Routing.Route("GetRolesList", "User") + '?userID=' + id}] 
    }); 

Non v'è alcun archivio dati in questione qui. Anche il tipo di risposta è text\html, non JSON, quindi non può essere confuso neanche. E come detto, sta funzionando bene in Firefox, e in Firefox, esegue anche la stessa funzione eval, ma senza l'errore. Quindi non è che Firefox segua un diverso percorso di esecuzione, è lo stesso, ma senza l'errore su eval.

+0

Nessuna delle "risposte" risolve il fatto che l'errore si verifica solo in IE. Stiamo ancora vivendo la stessa cosa in Ext 3.3.0. –

+0

Ciao Julian, se guardi in FireBug, cosa viene restituito dal server? Ext effettua una chiamata al server dopo di che muore in IE, sarebbe utile se la richiesta e la risposta sono pubblicate (comprese le intestazioni) –

+0

Io raccomando di usare Charles Proxy per ottenere le informazioni che Rob è dopo, dal momento che gli strumenti di debug di IE sono orribili –

risposta

2

ho localizzato la fonte del problema e non era in effetti con ExtJS. C'era una sezione nell'applicazione che ascoltava l'evento "requestcomplete" Ext.Ajax e tentava di decodificare response.responseText in json, anche se la risposta era HTML (che è solo in uno o due casi). IE non era divertito da questo.

1

Se si esegue il caricamento automatico in un pannello o elemento, una decodifica JSON non dovrebbe nemmeno essere coinvolta nel processo. UpdateManager si limita a est.Element.update (..) che accetta una stringa di html.

L'unica ragione per cui posso pensare che la tua risposta sia analizzata come JSON è se tu stessi usando un JSONStore per richiederlo - cosa stai usando?

Si dovrebbe essere in grado di fare qualcosa di semplice come questo:

 
var panel = new Ext.Panel({ 
    autoLoad: 'someurl' // this is the short form, you can still use the object config 
}); 

O

 
var element = Ext.get('element id').update({ 
    url: 'someurl' 
}); 

Risposta per aggiornare:

Questo sembra corretto fintanto che qualcosa di strano sta accadendo non con il metodo WMS.Routing.Route (...). Attualmente sto lavorando su un'applicazione ExtJS, quindi sono stato in grado di testare rapidamente diverse risposte del server e non ho potuto riprodurre il problema. Ho anche riavviato le sorgenti di ExtJS 2.2.1 e non vedo ancora nulla nell'aggiornamento degli elementi relativo e UpdateManager che effettui la chiamata a Ext.util.JSON.decode (...) che stai vedendo.

Sto immaginando che sia da una richiesta AJAX non correlata in un'altra parte della vostra applicazione. Se non lo hai già fatto, userei firebug/firebug lite per aiutare a eseguire il debug di questo - in particolare cerca di ottenere una traccia dello stack per assicurarti che l'origine del tuo problema sia proprio questo autoLoad.

+0

Grazie, vedere il mio aggiornamento. – JulianR

1

Non so quale sia il problema, ma volevo sottolineare che la tua "correzione" rende semplicemente restituire il json come una stringa invece di un oggetto eval'd, quindi ovviamente non c'è più nessun errore - hai rimosso la funzionalità. Si potrebbe altrettanto essere semplicemente:

this.decode = function(json){ 
    return json; 
} 

In generale, gli errori casuali come questo di solito non indicano un bug in Ext, soprattutto non in funzioni utilizzate come comunemente come Ext.decode. Direi che nel JSON c'è qualcosa che non piace a IE che gli altri browser ignorano, o più probabilmente, c'è qualcosa di inaspettato nella tua app che non è ovvio dalla tua descrizione. Hai provato a controllare la tua richiesta di accesso a Firebug per vedere come appare realmente il JSON? Hai provato a ottenere il risultato della tua chiamata Route in una variabile prima di verificarne il contenuto prima di compilare il pannello? Inoltre, prova a impostare l'opzione "interrompi tutti gli errori" in Firebug su true - molte volte quando ottieni una funzione casuale da Ext nella parte superiore della traccia dello stack, il colpevole è in realtà un codice di applicazione che non eri aspettando.

4

Controlla il tuo JSON. FF consente virgole finali negli oggetti JSON mentre IE no. per esempio.

{foo:'bar',baz:'boz',} 

funzionerebbe in FF ma in IE genererebbe un errore di sintassi. Affinché non ci sia un errore di sintassi JSON avrebbe bisogno di essere:

{foo:'bar',baz:'boz'} 
1

Ho avuto lo stesso problema, scusa il mio inglese, vengo da Mejico, spero di poter aiutare ... il mio problema è stato attivato quando invio un modulo per accedere, il mio PHP restituisce un JSON con la risposta in caso di errore in questo modo:

$respuesta = "{success: false, msgError: 'El usuario o contrase&ntilde;a son incorrectos'}"; 

ma non mi mando un resposne quando il successo, anche quando si ha un vero successo, allora l'ExtJS che stava cercando di decodificare la mia risposta JSON, ma non c'era nulla da decodificare, i Immagino che fosse, nel mio caso, il problema ... Ho risolto solo inviando una risposta per il vero successo, FF, Chrome, Safari, non capisco il problema, ma Opera e IE8 ... Spero di aiutare qualcuno, addio