xmlhttp.readyState == 4 && xmlhttp.status == 200 ==> FEHLER!

  • Themenstarter Themenstarter chofer02
  • Beginndatum Beginndatum
C

chofer02

Hallo, hab wieder ein problem mit meinem Code:
  1. folgende if Anweisung arbeitet falsch: xmlhttp.readyState == 4 && xmlhttp.status == 200
  2. bei der xml abfrage link.href erhalte ich nur [OBJECT]
Wäre super wenn mir jemand von euch helfen könnte!

Christoph

Code:
var xmlhttp = false;
if (window.xmlhttprequest)
{
xmlhttp = new xmlhttprequest ();
xmlhttp.overrideMimeType('text/xml');
}
else if (window.ActiveXObject)
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
 
function delstat()
{
document.getElementById('s_status').innerHTML = '';
}
 
function srch()
{
var e_query = document.getElementById('query').value;
if (e_query == "")
{
document.getElementById('result').innerHMTL = ' ';
}
if (e_query != "")
{
document.getElementById('prog').innerHMTL = 'Searching in progress...';
document.getElementById('s_status').innerHTML = '<img src="search.gif">';
var url = 'search.php?q=' + e_query;
 
xmlhttp.open('GET',url,true);
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var XMLDokument;
var i;
if (navigator.userAgent.indexOf("MSIE")>-1) 
{ 
	XMLDokument = new ActiveXObject("microsoft.xmldom"); 
	XMLDokument.async = false; 
	XMLDokument.load(xmlhttp.responseXML);
} 
 
if (navigator.userAgent.indexOf("Netscape")>-1) 
{ 
	XMLDokument = document.implementation.createDocument("", "", null); 
	XMLDokument.load(xmlhttp.responseXML); 
} 
 
{
var x = XMLDokument.getElementsByTagName('text');
var statistik = "Ihre Suchanfrage ergab "+x.length+" Treffer!";
document.getElementById('writeroot').innerHTML = statistik;
 
var x = XMLDokument.getElementsByTagName('text');
var newEl = document.createElement('P');
for (i=0;i<x.length;i++)
{
	if (x[i].childNodes[0].nodeType != 1 && x[i].childNodes[1].nodeType != 1) continue;
	var container = document.createElement('p');
	var link = document.createElement("a");
	var link_text = document.createTextNode(x[i].childNodes[0].firstChild.nodeValue);
	link.href = document.createTextNode(x[i].childNodes[1].firstChild.nodeValue);
	link.target = "_blank";
	link.appendChild(link_text);
	container.appendChild(link);
	newEl.appendChild(container);
}
document.getElementById('result').appendChild(newEl);
}
setTimeout("delstat()",700);
}
else
{
document.getElementById('result').innerHTML = 'Error: Search Failed!';
setTimeout("delstat()",700);
}
}
xmlhttp.send(null); 
}
}
 
Als ich den Code in geänderter Weise laufen ließ, habe ich eine Fehlermeldung erhalten. Leider habe ich mir den Wortlaut nicht aufgeschrieben, aber es hat etwas damit zu tun:
Code:
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
Der readyState verändert sich zwar, ist aber leider nicht fertig wenn das ganze übergeben wird.
 
Zum 1.
Diese Abfrage kann meines Erachtens nicht fehlerhaft sein.
Ich vermute, das XML-Dokument, welches du da empfängst, enthält einen Fehler, weshalb es unmöglich ist, daraus ein deues XML-Dokument zu erzeugen.

Ich glaube, um Fehler#1 auszumachen, müsste man die Sache live sehen.

Zu 2. der Inhalt des href-Attributes muss ein String sein, du weist ihm aber einen Textknoten zu.... was aus Javascript-Sicht ein Object ist.
 
Ok... ich wills mal so sagen: Ein Browser ist auch nur ein Mensch:-)

Du schickst den Browser in eine Endlosschleife...besser gesagt bei jedem Request in 3 Stück davon, in diesen Schleifen erzeugst du dann gleich neue Requests, .... abgesehen davon, dass da kein Browser mitkommt, frage ich mich, wozu das ganze?
Im Detail rede ich hiervon
Code:
function checkstat(p_stat)
{
while (p_stat != 4)
{
var e_query = document.getElementById('query').value;
var url = 'search.php?q=' + e_query;
xmlhttp.open('GET',url,true);
}
}
Dieser Funktion wird ein Parameter übergeben. Ist dieser ungleich 4, startet die Endlosschleife, ...das ist pro Request 3x der Fall. Da sich der Parameter nicht mehr ändert, läuft diese Schleife, bis man den Browser schliesst(oder ein netter Browser fragt, ob das Skript beendet werden soll).

Und noch eine andere Sache.... du hast vor, bei jedem onkeyup einen Request zu senden.
Dieser zieht eine Datenbankanfrage nach sich.... ich prophezeihe dir, dass da deine Datenbank sehr schnell in die Knie geht, falls dort mal mehrere Leute suchen.
 
Das ist mir schon klar dass die Datenbank das nicht lange mitmacht. Es geht in diesem Fall nur um das Probieren. ich werde den event dann noch verändern.

Das Problem mit dem ich kämpfe liegt darin, dass eine meiner functionen nicht fertig ist. Ich denke mit das so: Die PHP Datei versendet den XML String (der readystate verändert sich) und das Javascript beginnt den String einzulesen aber die PHP Datei ist mit dem versenden noch nicht fertig. Aus diesem grund habe ich auch diese Schleife erzeugt (um das einlesen etwas hinauszuzögern). Leider funktioniert sie nicht so wie ich das will.

Kannst du mir bitte helfen. Ich weiß nicht warum er meinen xml String hier nicht nimmt.

Danke im Voraus!

Christoph
 
Zuletzt bearbeitet von einem Moderator:
Die Antwort des Servers ist abgeschlossen, wenn der readyState 4 ist... da beisst die Maus keinen Faden ab.

Um den Request nach erfolgter Antwort zu beenden, solltest du für den IE am Schluss noch folgendes notieren:
Code:
xmlhttp.abort()

Ich meld mich demnächst wieder...mit was Funktionierendem, das wird schon;)
 
So... habs mal etwas abgewandelt.

Ein paar Anmerkungen dazu(im Quelltext stehen Details)

Ich habe bei den Änderungen komplett auf die XMLDOM-Geschichte verzichtet.
Warum:
Die Browser unterstützen das nicht gleichermassen gut wie XMLHttpRequest.
Um ehrlich zu sein... nur der IE kommt da voll zum Zug,... denn in ihm kann man die damit erzeugten Knoten per transformNode() mittels eines XSLT-Stylesheets transformieren...was im Mozilla bspw. überhaupt nicht geht, aber äussert praktisch und sinnvoll wäre, da es die ganze Sache mit dem Knoten-Erzeugen ersparen würde.
Opera kann mit XMLDOM überhaupt nichts anfangen.

Ich bin nun folgendermassen vorgegangen:
Das PHP-Skript erhält die Anfrage und antwortet mit JS-Code, welcher in der index.htm sodann mit einem schlichten eval() verarbeitet wird.

Falls dich die XMLDOM-Geschichte trotzdem interessiert, sag Bescheid... ich mach dann mal nen Beispiel fertig(IE-Only, versteht sich :-))
 

Anhänge

Ja wäre super, wenn du mir das mit der XMLDOM Geschichte auch machen könntest. Ich sitz jetzt schon seit einer ziemlich langen Zeit bei dem Code mit der Auswertung der XML Datei, aber leider funktionierts nicht so wie ich das will.

Christoph
 

Neue Beiträge

Zurück