2009-06-10 16 views
20

Prima di tutto, questo non è esattamente il modo ideale di configurare una pagina, tuttavia è necessario distribuire uno script come 1 file.Errore di Firefox 'Nessun elemento trovato'

Ho uno script php nella parte superiore di un altro documento xhtml con javascript e, in determinate condizioni, utilizzare XHR per inviare una stringa di query alla pagina stessa. Il php in alto poi si attiva e memorizza il contenuto passato come una sessione, quindi si uccide (exit()). XHR è asincrono e non viene mai controllato per vedere se restituisce il contenuto.

Tuttavia in Firefox 3, la console di errore genera un errore no element found ogni volta che viene inviata la richiesta XHR. Inoltre, se utilizzo un'uscita come exit('Done'), Firefox genera un errore di sintassi di (Done) come se fosse stato inserito nel DOM visibile. Questo non sembra accadere in Opera.

C'è un modo migliore per memorizzare una sessione da una pagina xhtml già generata? Ovviamente potrei eseguire l'XHR su un'altra pagina, ma preferirei mantenere tutto in uno script. Firefox tratta le richieste XHR come aggiornamenti al DOM? Non so perché sta inviando questo errore.


Aggiornamento Come ho detto, firefox thows solo l'errore quando la richiesta XHR è fatta. La pagina è XHTML valida e funziona perfettamente, senza errori a meno che la richiesta XHR non venga fatta sulla pagina stessa.

Mi chiedevo perché inviava l'errore perché in realtà non restituisce nulla.

Ecco uno snippet javascript che effettua una richiesta Ajax da un oggetto. Crea un oggetto XHR, senza una funzione di callback, e pubblica le informazioni. Funziona correttamente quando non fa riferimento alla stessa pagina.

var saveState = { saveContent: function(updateActiveMenu) { 
    var sendState = new ajaxObject(gV.url); 
    if (!updateActiveMenu) { 
     var storageContainer = document.getElementById("StorageContainer").innerHTML; 
     var menu = document.getElementById("Nav").innerHTML; 
     sendState.update("Containerstring="+urlencode(storageContainer)+"&Nav="+urlencode(menu)+"&Active="+gV.activeMenuItem, 'POST', true); } }, } 

E il php fa questo

if (isset($_REQUEST['Containerstring']) && isset($_REQUEST['Nav']) && isset($_REQUEST['Active'])) { 
    $_SESSION['Containerarray'] = (saveContainer(regulateEscapes(urldecode($_REQUEST['Containerstring'])))); 
    $_SESSION['Navarray'] = (saveNav(regulateEscapes(urldecode($_REQUEST['Nav'])))); 
    $_SESSION['Active'] = $_REQUEST['Active']; 
    exit('Done'); 
} 

Sono anche consapevole che non dovrebbe usare innerHTML ma questa è un'altra storia


L'errore è questo

Error: no element found 
Source File: http://localhost/ajax.php?1244648094055 
Line: 1 

Si noti che l'errore, mentre sul p pagina hp che sto usando, fa riferimento a una stringa di query che non viene mai chiamata.

+0

c'è qualche incoerenza in ciò che stai descrivendo. se xhr non usa mai il valore restituito (che è 'Fatto'), allora non può inserirlo in un DOM, ora può? – SilentGhost

+0

pubblica ancora qualche piccolo esempio del tuo codice. – SilentGhost

+0

Perché non inserire le parti rilevanti della sorgente della pagina? –

risposta

25

Firefox si aspetta di ottenere qualcosa che possa analizzare come XML e di generare un errore di analisi XML quando riceve una risposta vuota.

Prima le chiamate PHP "exit()", usano

header('Content-Type: text/plain'); 

e Firefox non cercherà di analizzare la risposta in formato XML, e ci dovrebbe essere nessun errore.

+0

Non importa, ho usato l'intestazione" HTTP/1.0 200 "e ho pensato che questo avrebbe fatto lo stesso, ero decisamente sbagliato;) Questo ha funzionato, grazie mille. –

+0

Nel mio caso stavo inviando una risposta vuota dal server e jQuery indovina per aspettarsi xml e cerca di analizzarlo. Ho semplicemente restituito "successo" e ha risolto il problema. Quindi la tua risposta mi ha aiutato anche a uscire. Grazie – sidonaldson

-2

Si dovrebbe avere il php restituire una risposta HTTP valida, perché Firefox proverà a leggerlo anche se non si fa nulla con esso. Quindi restituisci almeno un'intestazione valida

header("HTTP/1.0 200"); 
exit(); 
+1

Questa soluzione non ha funzionato, tuttavia l'intestazione 'Content-Type' ha fatto. –

Problemi correlati