Zwei xmlHttpRequests auf einer einzigen Seite
Ich bin Recht neu auf ajax, aber ich versuche zu implementieren, zwei einfache Aufrufe werden dynamisch geändert, zwei separate divs auf einer Seite mit javascript. Ich habe keine Probleme mit einem Aufruf zu einer Zeit, aber wenn ich zwei, wie es scheint, die zweite xmlhttprequest übernimmt den ersten und schreibt in die beiden divs.
Habe ich gelesen und versucht, mit den Fehlerbehebungen aufgelistet, die auf diese beiden anderen Beiträge beide weder scheint zu funktionieren in meinem Fall:
Senden zwei Ajax-Anfragen auf zwei verschiedene PHP-Skripte von einzelnen javascript-Funktion
Mit zwei xmlhttprequest-Aufrufe auf eine Seite
Und hier ist mein entsprechender code:
function request_handler(url, params, changed_div) {
if(window.XMLHttpRequest) {
try {
req = new XMLHttpRequest();
}catch(e) {
req = false;
}
}else if(window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
req = false;
}
}
}
if(req) {
req.onreadystatechange = function(){
if (req.readyState == 4 && req.status == 200){
document.getElementById(changed_div).innerHTML = req.responseText);
}
}
req.open("POST", url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(params)
return true;
}
return false;
}
Hier ist das grundlegende format der einzelnen Anforderung mit der Funktion oben:
request_handler("sample.php", parameters , "sample_div");
Entschuldigt, wenn ich bin vorbei an etwas, das einfach bis hier, ich kann einfach nicht scheinen, um es zu arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage
Mit zwei xmlhttprequest-Aufrufe auf eine Seite
hat deine Frage zu beantworten.
In Ihrem
request_handler
Funktion, die Sie verwenden eine Globale variablereq
dass überschrieben wird, bei jedem Aufruf der Funktion.Wenn Sie es ändern, um zu starten:
sollten Sie feststellen, dass es funktioniert. In diesem Fall
req
hat einen lokalen Bereich und ist so nicht überschrieben, wenn Sie anrufenrequest_handler
zum zweiten mal.Kann ich auch empfehlen, dass Sie dringend in Erwägung ziehen, die gerne von jQuery, Prototype oder Dojo, wenn Sie planen, auf das schreiben von Ajax-Skripte? Schreiben von Skripts, die Arbeit cross-Browser ist schwer, gut zu machen, und diese frameworks eine Menge zu tun die Beinarbeit für Sie.
onreadystatechange
- Handler verbunden sind, um die Anforderungen selbst, so konnte ich Ihnen nicht sagen. Aber der rest von meiner Antwort hält immer nochIhre
req
ist eine Globale variable definiert, ohne dievar
Schlüsselwort, im Hinterkopf behalten.Was ich denke passiert, ist, dass der zweite Aufruf überschreibt den ersten. Dies ist wegen der (Standard -) asynchrone Natur der
XMLHTTPRequest
. Ihre erste Funktionsaufruf enden wird, aber das abrufen der Seite ist noch im Gange. Die zweite Funktion aufrufen, dann überschreibt die Vorherige Anfrage.Diese jedoch nicht zu erklären, warum beide
div
gefüllt, mit dem Ergebnis der zweiten Ausschreibung. Ich muss sagen, ich bin ein wenig verloren auf.Dies ist ein ziemlich häufiges problem, vor allem, wenn Sie nicht wollen, um zusätzliche Maßnahmen ergreifen, um block weitere Anrufe, bis die erste fertig geladen ist. Seine ein größeres Thema, das ich decken in einem Beitrag, aber es gibt mehrere Beispiele, die auf der web der eine "Ajax-Queue", die effektiv verwaltet die Reihenfolge der eingegangenen Anfragen.
jQuery hat ein plugin für die Verwaltung von Warteschlangen und ich bin mir sicher, dass die meisten anderen JavaScript-frameworks wie Prototype und MooTools wird als gut. Wenn Sie wollen stick mit raw-JavaScript-ich würde werfen Sie einen Blick auf diese web-Seite:
http://www.cmarshall.net/MySoftware/ajax/index.html
Er implementiert eine Warteschlange sehr effektiv und ist ein hervorragendes Beispiel für seine Verwendung.