2009-06-10 5 views
20

Zunächst einmal ist dies nicht gerade der ideale Weg, um eine Seite einzurichten, aber es ist notwendig, ein Skript als 1 Datei zu verteilen.Firefox-Fehler 'Kein Element gefunden'

Ich habe einen PHP-Skript an der Spitze eines ansonsten XHTML-Dokuments mit Javascript, und unter bestimmten Bedingungen XHR verwenden, um eine Abfrage-String auf der Seite selbst zu senden. Der php an der Spitze wird dann aktiviert und speichert den übergebenen Inhalt als eine Sitzung und tötet sich dann selbst (exit()). Das XHR ist asynchron und wird nie überprüft, ob es Inhalt zurückgibt.

jedoch in Firefox 3, löst die Fehlerkonsole einen Fehler no element found jedes Mal, wenn die XHR Anfrage gesendet wird. Auch wenn ich einen Exit wie exit('Done') verwende, löst Firefox einen Syntaxfehler von (Done) aus, als ob er es in das sichtbare DOM einfügt. Dies scheint in Opera nicht zu passieren.

Gibt es einen besseren Weg, um eine Sitzung von einer bereits erzeugt XHTML-Seite zu speichern? Offensichtlich könnte ich XHR auf eine andere Seite, aber ich würde es vorziehen, alles auf einem Skript zu behalten. Behandelt Firefox XHR-Anfragen an sich selbst als Updates für das DOM? Ich weiß nicht, warum es diesen Fehler sendet.


aktualisiert Wie gesagt, thows nur firefox die Fehler, wenn der XHR Antrag gestellt wird. Die Seite ist XHTML-gültig und funktioniert fehlerfrei, es sei denn, die XHR-Anforderung wird an die Seite selbst gestellt.

ich mich gefragt, warum es den Fehler zu senden, weil es wirklich nicht alles zurück.

Hier ist ein Javascript-Schnipsel, die einen Ajax-Request von einem Objekt macht. Es erstellt ein XHR-Objekt ohne Rückruffunktion und sendet die Informationen. Es funktioniert ordnungsgemäß, wenn nicht auf dieselbe Seite verwiesen wird.

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); } }, } 

und die PHP tut dies

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'); 
} 

ich auch bewusst bin, sollte ich nicht innerHTML- verwenden, aber das ist eine andere Geschichte


Der Fehler ist dies

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

Beachten Sie, dass der Fehler, während auf der p hp-Seite, die ich verwende, verweist auf eine Abfragezeichenfolge, die nie aufgerufen wird.

+0

Es gibt einige Unstimmigkeiten in dem, was Sie beschreiben. Wenn xhr nie den zurückgegebenen Wert verwendet (was "Done" ist), dann kann es nicht in ein DOM eingefügt werden, oder? – SilentGhost

+0

noch besser poste ein kleines Beispiel Ihres Codes. – SilentGhost

+0

Warum legen Sie die relevanten Teile der Seitenquelle nicht hoch? –

Antwort

25

Firefox erwartet etwas zu bekommen, es wieder als XML analysieren kann, und wirft eine XML-Parsing-Fehler, wenn es eine leere Antwort bekommt.

Bevor Sie Ihre PHP-Anrufe "exit()" verwenden

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

und Firefox wird nicht versuchen, die Antwort als XML zu analysieren, und es sollte kein Fehler sein.

+0

Macht nichts, ich benutzte den" HTTP/1.0 200 "Header und nahm an, dies würde das gleiche tun, war ich definitiv falsch;) Das hat funktioniert, vielen Dank. –

+0

In meinem Fall habe ich eine leere Antwort vom Server zurückgeschickt und jQuery erwartet, dass xml erwartet wird und versucht es zu parsen. Ich habe einfach "Erfolg" zurückgegeben und das Problem behoben. Also antwortest du mir auch geholfen. Danke – sidonaldson

-2

Sie sollten Ihre PHP eine gültige HTTP-Antwort zurückgeben, weil Firefox versuchen wird, es zu lesen, auch wenn Sie nichts damit tun. Also geben Sie mindestens eine gültige Kopfzeile zurück

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

Diese Lösung hat nicht funktioniert, aber die 'Content-Type' Header hat. –