Frage zu JQuery $.get

RipmaV

Mitglied
Folgenden Code habe ich um eine XML Datei aus zu lesen und ein zufälliges Element im Dokument an zu zeigen, was auch funktioniert.

Code:
$(document).ready(function(){
var textarray = new Array();
var zaehler = 0;
var zufall = 0;
	$.get('content/didyouknow.xml',function(d){
		$(d).find('item').each(function(){
			var $duk = $(this);
			var text = $duk.find('text').text();
			text = text.replace("[ i]","<i>");
			text = text.replace("[ /i]","</i>");
			textarray[zaehler] = text;
			zaehler++;
			});
	var anzahl = parseInt(textarray.length);
	zufall = parseInt(Math.random()*(anzahl));
	$('#binfo_wusstestdu_text').html(textarray[zufall]);
	});

});

Nun ist meine Frage hier zu, wieso ist das textarray nach der Ausführung von $.get wieder leer obwohl ich das Array vor dem auslesen der XML erzeuge?
Und wie kann ich dafür sorgen dass der Inhalt des Arrays auch danach noch vorhanden ist?

Gruß und Dank
RipmaV
 
Das Sprachkonstrukt var bewirkt, dass eine Variable, welche außerhalb einer Funktion gesetzt wurde, global verfügbar ist. In einer Funktion hingegen bewirkt es genau das Gegenteil: die Variable ist versteckt. Entferne es mal und schau, was passiert. Anders kann ich es mir nicht erklären.
 
Wenn ich die variablen außerhalb, und somit global setzte, sind diese nach dem Durchlauf von $.get wieder leer.
Überprüft habe ich es indem ich textarray, zufall und zaehler außerhalb der funktion positioniert habe und dann nach dem "$.get ein console.log(textarray[zufall]) ;" eingefügt habe und die konsole sagt mir immer "undefined".

Code:
var textarray = new Array();
var zaehler = 0;
var zufall = 0;

$(document).ready(function(){

	$.get('content/didyouknow.xml',function(d){
		$(d).find('item').each(function(){
			var $duk = $(this);
			var text = $duk.find('text').text();
			text = text.replace("[ i]","<i>");
			text = text.replace("[ /i]","</i>");
			textarray[zaehler] = text;
			zaehler++;
			});
	var anzahl = parseInt(textarray.length);
	zufall = parseInt(Math.random()*(anzahl));
	$('#binfo_wusstestdu_text').html(textarray[zufall]);
	});
	console.log(textarray[zufall]);

});
 
Hi,

am Script liegt es nicht - zumindest entdecke ich keinen Fehler.

Stimmt der Pfad?
Lieferst du wohlgeformtes (valides) XML aus?

Weiterhin kann es sein bzw. wird es wohl so sein, dass zu dem Zeitpunkt, an dem du auf das Array (textarray) zugreifen möchtest, der asynchrone Request noch nicht abgeschlossen ist. Damit existiert die Variable zufall sowie das gefüllte Array noch nicht.
Um sicher zu stellen, dass der Request abgeschlossen ist, ehe du mit dessen Ergebnissen weiterarbeitest, solltest du die callback-Funktion nutzen bzw. aus ihr heraus die Folgefunktionen aufrufen.

Ciao
Quaese
 
Ja der Pfad stimmt, er läd ja auch das XML. Nur ist das "textarray", sobald der $.get Aufruf vorbei ist wieder leer.
Das hier funktioniert ja soweit; er zeigt den Inhalt auf er Webseite an:
Code:
$('#binfo_wusstestdu_text').html(textarray[zufall]);

Nur würde ich "textarray" auch gern weiter verwenden und kein neues Request senden für eine weitere Funktion (die ich noch nicht geschrieben habe da mir dafür der Inhalt von "textarray" und "zufall" zur Verfügung stehen müsste, außerhalb des Ajax-Requests).
 
Quaese hat dir die richtige Antwrt eigentlich bereits gegeben. Dein console.log steht ausserhalb des get Requests und wird schon ausgeführt bevor der Request abgeschlossen ist.
Als Beispiel:
Javascript:
$('#btn').click(function(){
    var getCallIsReady = false;
    $.get('url',function(data){
        getCallIsReady = true;
        alert(getCallIsReady);
    });
    alert(getCallIsReady);
});
Das wird sofort nach dem Klick auf #btn ein alert mit false ausgeben und erst wenn der Request abgeschlossen ist erscheint noch ein alert mit true.

Und hier hab ich noch schnell ein Beispiel zusammen gekritzelt wie du es machen könntest:
http://jsfiddle.net/WXQfA/
 
In dem Beispiel sind die Daten doch global verfügbar.
Die Frage ist nur wann du sie ansprichst. Das darf halt erst passieren wenn der Request abgeschlossen ist.
 

Neue Beiträge

Zurück