Das deutet in aller Regel darauf hin, dass ein Formularversand (per GET), der eigentlich per Script unterbunden werden sollt, doch stattgefunden hat - weil im Script ein Fehler auftrat, so dass das das Abschicken unterbindende return false nicht mehr zur Ausfuehrung kam.
MfG ChrisB
Guten Morgen,
ich danke Dir. Daran hätte ich nie gedacht.
Im aufrufenden Formular habe ich sogar vergessen, die Methode (GET oder POST) anzugeben. Nachdem ich endlich die Fehler-Konsole im Firefox gefunden habe (man lernt scheinbar nie aus :D ) habe ich auch das Hauptproblem gefunden:
uncaught exception: [Exception... "Component returned failure code: 0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f (<unknown>)" location:...
Also hatte ich scheinbar mit der Vermutung der Überschneidung nicht ganz Unrecht: Während des Aufrufs von "xmlHttp.setRequestHeader" in der Funktion "saveData()" (nun ist es zumindest eine) wird scheibar bereits in der Methode "loadData()" auf das Request-Objekt zugegriffen. Wenn ich alles richtig verstanden habe, bedeutet der obige Fehlercode nichts anderes als den Versuch eines doppelten Zugriffes.
"saveData()" habe ich nun folgendermaßen abgeändert:
function saveData()
{
if (xmlHttp) {
message = encodeURIComponent(document.getElementById("inputMessage").value);
var param='message=' + message;
xmlHttp2.open("POST", "setdata.php", true);
xmlHttp2.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp2.setRequestHeader("Content-length", param.length);
xmlHttp2.setRequestHeader("Connection", "close");
// make the server request
xmlHttp2.send(param);
}
// Message-Eingabefelder leeren und Focus setzen
document.getElementById("inputMessage").value = '';
document.getElementById("inputMessage").focus();
return false;
}
Dafür habe ich nun zu Beginn ein zweites Objekt namens "xmlHttp2" erzeugt (genauso wie das andere auch). Damit wird der Fehler grob unterbunden.
"Grob", weil bei einer versehentlichen doppelten Betätigung der Enter-Taste der gleiche Fehlercode erzeugt wird. Als Zugabe gibt es dann auch noch den Fehler "xmlHttp is not defined".
Bei der eigentlichen Suche nach dem Fehlercode bin ich auf folgender Seite über diesen Workaround gestolpert:
try {
deineFunktion();
} catch(e) {
//Fehler abgefangen
//Funktion mit Verzögerung erneut aufgerufen
setTimeout("deineFunktion()", 500);
}
Angewandt auf "saveData()":
function saveData()
{
try{
if (xmlHttp) {
message = encodeURIComponent(document.getElementById("inputMessage").value);
var param='message=' + message;
xmlHttp.open("POST", "setdata.php", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
// make the server request
xmlHttp.send(param);
}
// Message-Eingabefelder leeren und Focus setzen
document.getElementById("inputMessage").value = '';
document.getElementById("inputMessage").focus();
}
catch (e) { setTimeout("saveData()", 500); }
return false;
}
So gibt es kein Neuladen der Seite mehr.
Zum Testen versuche ich, möglichst schnell ein Zeichen einzugeben und mit Enter abzuschicken. Dieses halt möglichst schnell und oft hintereinander. Der unschöne Nebeneffekt bei diesem "Workaround" verschwindet kurz die Nutzerliste, welche in "loadData()" komplett erneuert wird, und taucht dann wieder auf. Vermutlich aufgrund des Timeouts.
Das Problem scheint damit erst einmal gelöst zu sein - es sei denn, es gibt noch einen "besseren" Weg. Die blinkende Nutzerliste sollte wohl bei "normaler" Chat-Benutzung nicht passieren.
Ich danke Dir vielmals für den Hinweis!
Gruß,
Christian