• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

jQuery-Problem

DeletedUser

Gast
Hallo,

ich bin gerade am (Neu-)schreiben eines Userscripts und verwende (wie immer) dazu jQuery. Mit der .each()-Funktion habe ich aber ein kleines Problem.

Mein Code:
Code:
$('table#attack_results tr').each(function(index) {
	var tr_title = $(this).find('th').eq(0).text();
	alert(tr_title);
	switch(tr_title) {
		case "Schaden durch Rammböcke:":
			var wall_pre = $(this).find('td').eq(0).find('b').eq(0).text();
			var wall_after = $(this).find('td').eq(0).find('b').eq(1).text();
			break;
		case "Veränderung der Zustimmung:":
			var loyalty = $(this).find('td').eq(0).find('b').eq(0).text();
			break;
		default:
			break;
	}
alert(wall_pre);
});

Wie man erkennen kann, versuche ich aus einem Bericht die Wallstufe vorher und nachher auszulesen. Allerdings ist das Ergebnis am Ende (nach vollständigem Durchlaufen der Schleife) undefined. Der Code zur Bestimmung von wall_pre und wall_after ist aber trotzdem korrekt, der Alert unten gibt mir nach dem tr_title "Schaden durch Rammböcke:" ordnungsgemäß die richtige Wallstufe (z.B. 20) aus. Allerdings wird diese Variable im nächsten Durchlauf anscheinend "vernichtet". Das Problem tritt bei der Verwendung von .each() jetzt schon zum wiederholten Mal auf... Weißt jemand, was ich falsch mache oder wie man das Problem lösen kann?

Gruß atlantic
 

DeletedUser

Gast
Deklarier die Variablen mal außerhalb der Schleife.

Code:
var wall_pre;
var wall_after;
var loyality;
$('table#attack_results tr').each(function(index) {
	var tr_title = $(this).find('th').eq(0).text();
	alert(tr_title);
	switch(tr_title) {
		case "Schaden durch Rammböcke:":
			wall_pre = $(this).find('td').eq(0).find('b').eq(0).text();
			wall_after = $(this).find('td').eq(0).find('b').eq(1).text();
			break;
		case "Veränderung der Zustimmung:":
			loyalty = $(this).find('td').eq(0).find('b').eq(0).text();
			break;
		default:
			break;
	}
alert(wall_pre);
});
 

DeletedUser

Gast
Danke schonmal, funktioniert aber leider immer noch nicht :S Was könnte man noch versuchen?
 

DeletedUser61033

Gast
wie bindest du das jQuery ein? über unsafeWindow von DS?

Die Schleife wird dann nämlich im Scope des normalen Sourcecodes ausgeführt. Und damit werden die Variablen auch dort definiert und sind wegen der Sandbox von GM nicht zugänglich für dieses. Um auf diese zugreifen zu können, musst du sie über unsafeWindow einbinden.

Natürlich musst du auch darauf achten, dass du die Variablen nicht mit "var" in der Schleifen-Funktion selbst deklarierst, denn dann wären sie ausschließlich für diese Funktion zugänglich. (Wieder so ne Scope-Geschichte^^)


Das sollte funktionieren:
Code:
$('table#attack_results tr').each(function(index) {
	var tr_title = $(this).find('th').eq(0).text();
	alert(tr_title);
	switch(tr_title) {
		case "Schaden durch Rammböcke:":
			wall_pre = $(this).find('td').eq(0).find('b').eq(0).text();
			wall_after = $(this).find('td').eq(0).find('b').eq(1).text();
			break;
		case "Veränderung der Zustimmung:":
			loyalty = $(this).find('td').eq(0).find('b').eq(0).text();
			break;
		default:
			break;
	}
});
var wall_pre = unsafeWindow.wall_pre;
alert(wall_pre);


Deswegen mag ich keine nachgebauten each-Schleifen. Verursachen zumeist nur mehr Ärger als das sie nützlich sind.


mfg
Heinzel
 
Oben