2009-08-03 4 views
2

Ich habe ein Problem mit getElementsByTagName in IE (7 und 8).Ajax mit PHP und XML, getElementsByTagName IE Problem

Ich habe eine Adressensuche, die jede vorgeschlagene Adresse (als eine XML-Zeichenfolge) in eine PHP-Sitzungsvariable zurückgibt, auf die dann mithilfe einer AJAX-Funktion zugegriffen wird, die die angeforderte Sitzungsvariable zurückgibt.

Jede Sitzung Variable wird in Schritt 1 der ajax Adressensuche gesetzt (I habe, ohne die Zeichencodierung mit versucht und mit UTF-8):

$_SESSION['addrHint_' . $k1] = '<?xml version="1.0" encoding="ISO-8859-1"?>'; 
$_SESSION['addrHint_' . $k1] .= '<Address>'; 
$_SESSION['addrHint_' . $k1] .= '<Postcode>' . $v1->Postcode . ' </Postcode>'; 
$_SESSION['addrHint_' . $k1] .= '<Line1>' . $v1->Line1 . ' </Line1>'; 
$_SESSION['addrHint_' . $k1] .= '<Line2>' . $v1->Line2 . ' </Line2>'; 
$_SESSION['addrHint_' . $k1] .= '<Line3>' . $v1->Line3 . ' </Line3>'; 
$_SESSION['addrHint_' . $k1] .= '</Address>'; 

Und dann in Schritt 2 abgerufen:

header('Content-Type: text/xml'); 
print_r($_SESSION['addrHint_'.$_REQUEST['addr']]); 

In dem AJAX js, wenn der Staat bereit ist, führt er unter anderem ähnlichen Zeilen Code, dies:

var xmlDoc = xmlHttp.responseXML; 
var xmlRoot = xmlDoc.documentElement; 
var postcode = xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue; 
document.forms[0]["address"+addr+"_Postcode"].value = postcode.substring(0, postcode.length-1); 

(Es macht eine ähnliche Sache für jede Zeile der Adresse.) Das Länge-1-Snippet ist da, weil ich an jedes Element ein Leerzeichen anhängen musste, um ein Problem zu stoppen, das ich hatte, wenn ein Element null war.

Es funktioniert gut in Firefox, aber überhaupt nicht in IE. Ich habe seit dem Googeln und fand eine Reihe von Ergebnissen auf den ersten 5 Seiten, aber keine Lösungen. Ich wäre sehr dankbar, wenn irgendjemand etwas dazu beitragen könnte.

Vielen Dank im Voraus.

+0

Danke für die schnelle Antworten unten, ich habe seitdem das Problem verursacht, wenn es keine Zeile z. B. der Adresse gibt, bricht es das Skript, anstatt in die nächste Zeile zu überspringen. Ich dachte, ich hätte dieses Problem durch Anhängen von Leerzeichen an jeden Nullwert sortiert. Selbst wenn sie null wären, hätte sie einen Rückgabewert. – bcmcfc

Antwort

2

Anstatt die Rückgabewerte ändern, sollten Sie vielleicht um die Überprüfung einige Fehler implementieren der Code, der Ihre Knotenwerte abruft.

Wenn Sie eine Tonne Verkettung machen, können Sie nicht nach Nullen suchen. Statt wie dies von Verkettungs:

xmlRoot.getElementsByTagName("Postcode")[0].childNodes[0].nodeValue 

Warum einige Fehler nicht addieren, bevor die Hand überprüfen? Etwas wie:

var postCodes = xmlRoot.getElementsByTagName("Postcode"); 
if(postCodes && postCodes[0] && postCodes[0].childNodes[0]) { 
    document.forms[0]["address"+addr+"_Postcode"].value = postCodes[0].childNodes[0].childNodes[0].nodeValue; 
} 

Auf diese Weise werden Sie nur die Zuordnung versuchen, wenn es keine Daten gibt. Einen leeren Eingabewert erhalten, wo Sie es erwarten.

Jetzt, alle diese Verkettung und wenn Aussage ermüdend werden kann, so können Sie das in einer Funktion wickeln, wenn Sie möchten.

Fühlen Sie sich frei hier ein funktionierendes Beispiel zu überprüfen: http://jsbin.com/ahidu

Prost!

+0

Das ist fantastisch, danke. – bcmcfc

0

print_r ???

print_r($_SESSION['addrHint_'.$_REQUEST['addr']]); 

"$ SESSION [ 'addrHint'. $ _ REQUEST [ 'addr']]" ist kein Array.

+0

Ja, es ist eine Zeichenfolge, die den XML-Code enthält, daher verhält sich print_r() wie print/echo. Sonst würde es in FF nicht funktionieren. print_r() könnte hier verwirrend sein, aber es ist nicht ganz falsch ;-) – VolkerK

+0

Die print_r war übrig von, als ich noch ein Array zurückgab, ich hatte es versäumt, es zurück zu einem Echo zu schalten. Schätzen Sie die Erklärungen in Bezug auf die ordnungsgemäße Verwendung. – bcmcfc

0

Verwenden Sie die IE-Entwickler-Tools (IE8: Built-in, IE7: Developer Toolbar), um das Javascript zu debuggen.
Sie könnten auch einige console debug code z. den Fertigstatus verfolgen.
Auf der Server-Seite error_reporting der Satz PHP auf E_ALL und halten ein Auge auf die error.log der Webserver (wo die PHP-Nachrichten angezeigt wird)

+0

Diese Entwicklersymbolleiste ist unglaublich praktisch! Ich hatte keine Ahnung, dass es existiert, danke für die Köpfe. – bcmcfc