Frage von FelixCrafting, 29

Wieso funktioniert mein JavaScript nur im Debugmodus (von Firefox)?

Ich habe ein JavaScript geschrieben (für ein Confluence-Plugin). Das Problem ist, dass die values von tagsaTB und tagsdTB nur dann richtig von tags übernommen werden, wenn ich in den Zeilen Breakpiont setze und diese dann einzeln durchgehe. Wenn die Breakpoints deaktiviert sind, bleiben die values = "". Woran kann das liegen??? Hier der Code wo es haakt:

AJS.$("#vergeben").click(function() { isOpen = true; // Die Schlagwörter der aktuellen Seite hohlen var tags = ""; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { tags = xhr.responseText; } } xhr.open('GET', '/plugins/servlet/get-tags?pageid=' + AJS.params.pageId, true); xhr.send(null); var tagsaTB = document.getElementById('tagsa'); var tagsdTB = document.getElementById('tagsd'); tagsaTB.value = tags; tagsdTB.value = tags; // Zu erster Seite gehen und den Dialog anzeigen dialog.gotoPage(0); dialog.gotoPanel(0); dialog.show(); });

Danke schon mal im Vorraus.

Antwort
von Dory1, 21

Der XMLHttpRequest ist eine asynchrone Operation, d.h. deine Variable "Tags" wird erst dann "befüllt" sobald die Antwort des Servers da ist. Der Rest deiner Funktion läuft aber schon munter weiter, während noch auf die auf die Antwort gewartet wird. In dem Moment wo die Antwort des Servers ankommt, ist die Funktion schon längst beendet. 

Du musst also den Code, der die HTML-Elemente mit dem Ergebnis befüllt in den onreadystatechange-Callback verschieben:

AJS.$("#vergeben").click(function() {
isOpen = true;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var tags = xhr.responseText;
var tagsaTB = document.getElementById('tagsa');
var tagsdTB = document.getElementById('tagsd');
tagsaTB.value = tags;
tagsdTB.value = tags;
dialog.gotoPage(0);
dialog.gotoPanel(0);
dialog.show();
}
}
xhr.open('GET', '/plugins/servlet/get-tags?pageid=' + AJS.params.pageId, true);
xhr.send(null);
});

Keine passende Antwort gefunden?

Fragen Sie die Community