Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-08-2007, 07:44   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
problem mit 'for ... in' und 'push' bei childNodes abfragung

Hallo!
Habe folgendes Skript umgeschrieben:

Code:
_root['subarr'+i] = [];
for (k in this.firstChild.childNodes[i].attributes) {
				_root['subarr'+i].push(this.firstChild.childNodes[i].attributes[k]);
			}
in:

Code:
if (this.childNodes[i].childNodes[7].hasChildNodes()) {
				for (b=7; b<this.childNodes[i].childNodes.length; b++) {
					for (k in this.childNodes[i].childNodes[b].childNodes[0].childNodes) {
						_root['subarr'+i].push(this.childNodes[i].childNodes[b].childNodes[0].childNodes);
					}
										
				}
			}
die var b und das this.childNodes[i].childNodes[b].childNodes[0].childNodes kennt er auch, nur er übergibt es nicht dem array _root['subarr'+i].

Kann mir jemand erklären wo ich da den logischen unterschied habe?
Shousté ist offline   Mit Zitat antworten
Alt 09-08-2007, 14:02   #2 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
PHP-Code:
for (... 
das ist das einzige mal, daß die var k in deinem script auftaucht


PHP-Code:
var arr=['hallo','welt']
for(var 
k in arr)
{
    
trace(k)
    
trace(arr[k])
}
trace('----------------------------')
var 
o= new Object()
o.a='hallo'
o.b='welt'
for(var k in o)
{
    
trace(k)
    
trace(o[k])

warrantmaster ist offline   Mit Zitat antworten
Alt 09-08-2007, 14:14   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
jaja, schon klar. aber das skript ist noch viel grösser. ich hab da ein menü hergenommen, ich glaube sogar eins von dir (dyn-menue.swf), und da sind sooooo viele variablen nicht definiert bevor sie gebraucht werden und alles irgendwie durcheinander (erst ganz unten definiert, gar nicht definiert, etc.), da ist glaub ich das k an sich auch egal. ich häng mal das skript mit an, das ich da jetzt für mich programmiert hab.

ausserdem hab ich jetzt auch rausgefunden, dass er eh was reinspeichert, aber nur das letzte von den childNodes, die anderen vergisst/überspeichert er wieder.
Angehängte Dateien
Dateityp: txt skript.txt (6,3 KB, 1x aufgerufen)

Geändert von Shousté (09-08-2007 um 14:17 Uhr)
Shousté ist offline   Mit Zitat antworten
Alt 09-08-2007, 15:51   #4 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
Zitat:
Zitat von Shousté Beitrag anzeigen
..... und da sind sooooo viele variablen nicht definiert bevor sie gebraucht werden und alles irgendwie durcheinander (erst ganz unten definiert, gar nicht definiert, etc.), da ist glaub ich das k an sich auch egal.


wir reden aber von verschiedenen sachen.
lies mein letztes posting nochmal genau.
warrantmaster ist offline   Mit Zitat antworten
Alt 10-08-2007, 07:12   #5 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
ich weiß schon was du meinst, abert es funktioniert auch so nicht:

Code:
if (this.childNodes[i].childNodes[7].hasChildNodes()) {
				for (b=7; b<this.childNodes[i].childNodes.length; b++) {
					for (k in this.childNodes[i].childNodes[b].childNodes[0].childNodes[k]) {
						_root['subarr'+i].push(m.childNodes[i].childNodes[b].childNodes[0].childNodes[k]);
					}
				}
			}

ich hab da schon 100 verschiedene sachen ausprobiert. funktioniert aber alles nicht. was macht den die for...in-schleife überhaupt genau? is die sowas wie die foreach-schleife, oder? und wo liegt der logische unterschied zwischen for...in und push?
Shousté ist offline   Mit Zitat antworten
Alt 10-08-2007, 07:37   #6 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
PHP-Code:
for (k in this.childNodes[i].childNodes[b].childNodes[0].childNodes) {
                        
_root['subarr'+i].push(this.childNodes[i].childNodes[b].childNodes[0].childNodes);
                    } 
Hier machst du zigmal das gleiche, du packst immer das gleiche Objekt nochmal ins Array.
Wie warrantmaster schon sagte ist dort nur einmal ein k, und zwar im Schleifenkopf und dann nutzt du es nicht.
Vielleicht meinst du es so:
PHP-Code:
for (k in this.childNodes[i].childNodes[b].childNodes[0].childNodes) {
                        
_root['subarr'+i].push(this.childNodes[i].childNodes[b].childNodes[0].childNodes[k]);
                    } 

Und das hier geht schon einmal gar nicht...
for (k in this.childNodes[i].childNodes[b].childNodes[0].childNodes[k])
__________________
ERROR: Signature is too large

Geändert von rendner[i] (10-08-2007 um 07:44 Uhr)
rendner[i] ist offline   Mit Zitat antworten
Alt 10-08-2007, 08:47   #7 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
okay, ich glaube, ich brauche einen befehl, der genau das selbe macht wie der for...in ... ,also alle childNodes in das Array _root['subarr'+1] rein speichert. es funktioniert ja schon, nur eben mit dem als letztes reingespeicherten objekt. dieses objekt weiß aber auch schon wo es hin muss. schaut euch bitte die datei an, das entsprechende beginnt ab zeile 138. vl is es dann klarer, was mein problem ist.
Angehängte Dateien
Dateityp: zip test.zip (8,9 KB, 0x aufgerufen)

Geändert von Shousté (10-08-2007 um 08:51 Uhr)
Shousté ist offline   Mit Zitat antworten
Alt 22-08-2007, 08:03   #8 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
bin jetzt schon "weiter" gekommen, nun weiß ich: er traced mir zwar die arrays gleich, aber im debugger sehen die objekte folgendermaßen aus:

meins:
Variable _level0.subarr4 = [Objekt #67, Klasse 'Array'] [
0:[Objekt #68, Klasse 'Array'] [
0:[Objekt #69, Klasse 'XMLNode'] {
X-Tention News
}
],
1:[Objekt #70, Klasse 'Array'] [
0:[Objekt #71, Klasse 'XMLNode'] {
X-Tention Observer
}
]
]


funktionierendes von warrantmaster:
Variable _level0.subarr6 = [Objekt #36, Klasse 'Array'] [
0:"google",
1:"ebay",
2:"amazon",
3:"google2",
4:"lycos",
5:"amazon",
6:"google1",
7:"ebay1"
]



mein gott, stinkt das ganze!
könnt ihr mir nicht weiter helfen??

LG
Shousté ist offline   Mit Zitat antworten
Alt 22-08-2007, 08:26   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.138
Was willst du denn nun machen? Attribute auslesen? Arrays speichern? Denn am Anfang willst du noch an die Attribute.
Omega Psi ist offline   Mit Zitat antworten
Alt 22-08-2007, 08:44   #10 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
so, gerade die eigentliche fehlerquelle entdeckt: genau, der fehler ist: in der vorgabedatei werden attribute angesprochen. ich muss aber nodes ansprechen. wenn ich die xml umschreibe auf attribute und die fla anpasse dann funktionierts.

also, meine letzte fragekorrektur: ich muss mehr oder weniger die nodes in attribute bekommen, darf aber die XML nicht verändern. geht das?
bzw. muss das ganze script irgendwie so hinbiegen, dass es auch nodes akzeptiert.

Danke für deine Hilfe, wenn du die Lösung weißt, und ich dich jemals treffe, spendier ich dir eine Limo
Shousté ist offline   Mit Zitat antworten
Alt 22-08-2007, 08:48   #11 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
anbei noch die dateien, damit du siehst, woran du sehen kannst, was ich meine, wenn du nicht weißt was ich meine

die XML ist schlampig geschrieben
Angehängte Dateien
Dateityp: zip test.zip (26,2 KB, 0x aufgerufen)
Shousté ist offline   Mit Zitat antworten
Alt 22-08-2007, 09:00   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.138
Also, das ist so: du speicherst die Referenzen auf die childNodes in dem Array. Ich weiss ja nicht, ob du auch selbst programmierst, aber das arbeiten auf eine XML als Datenhaltung mehr als unüblich. Speicher lieber gleich die Werte in einem Array. Wenn das nicht geht oder für dich zu abstrakt ist, dann kannst du es so machen:
ActionScript:
  1. var nodeArray:Array = new Array();
  2. var xml:XML = new XML("<root><nodes><node /><node /><node /></nodes></root>");
  3. for (var i:Number = 0; i<xml.firstChild.childNodes.length; i++) {
  4.     for (var j:Number = 0; j<xml.firstChild.childNodes[i].childNodes.length; j++) {
  5.         nodeArray.push(xml.firstChild.childNodes[i].childNodes[i]);
  6.     }
  7. }
So werden alle <node />-Knoten in dem Array gespeichert.
Omega Psi ist offline   Mit Zitat antworten
Alt 22-08-2007, 09:08   #13 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
also die XML programmiert mir ein CMS heraus, dass kann ich nicht ändern, das ist ja auch der grösste s****ß.

die Nodes ansich kann ich ja schon einlesen, und auch richtig tracen (also so wie in dem beispiel von warrentmaster), der Array wird in der swf falsch ausgegeben. wenn ich es mit attributen mache, dann funktioniert das ganze einwandfrei nur indem ich den letzten knotenpunkt durch .attributes.name ersetze.

ich häng nochmal die nicht funktionierende version an, damit du den unterschied siehst (ab Zeile 230 bzw. die xml)
Angehängte Dateien
Dateityp: zip menue.zip (12,1 KB, 1x aufgerufen)
Shousté ist offline   Mit Zitat antworten
Alt 22-08-2007, 09:14   #14 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.138
Also wenn's nun läuft, dann ist ja alles gut.

Ich würde aber etwas mehr Struktur vorschlagen...
Omega Psi ist offline   Mit Zitat antworten
Alt 22-08-2007, 09:18   #15 (permalink)
Neuer User
 
Registriert seit: Jul 2007
Beiträge: 49
neinneinnein ... ich kann ja die xml nicht verändern, weil die mir automatisch generiert wird. das was ich da verändert habe, war nur 1 output des CMS, aber ich muss es so hinbringen, dass die nodes angesprochen werden und die ganze sache in der swf richtig dagestellt wird, weil das funktioniert eben nicht, was mit attributen schon funktioniert.

vl hilft dir der output vom debugger ein bisschen mehr:

attribute:
Variable _level0.subarr6 = [Objekt #36, Klasse 'Array'] [
0:"google",
1:"ebay",
2:"amazon",
3:"google2",
4:"lycos",
5:"amazon",
6:"google1",
7:"ebay1"
]

nodes:
Variable _level0.subarr4 = [Objekt #67, Klasse 'Array'] [
0:[Objekt #68, Klasse 'Array'] [
0:[Objekt #69, Klasse 'XMLNode'] {
X-Tention News
}
],
1:[Objekt #70, Klasse 'Array'] [
0:[Objekt #71, Klasse 'XMLNode'] {
X-Tention Observer
}
]
]

wobei eben der array über trace(); gleich ausgegeben wird.



ja, strukturmäßig muss ich noch viel ausbessern, aber wenn man immer dort und da was hinzubastelt und dort weg, dann verliert man schnell mal ein bisschen organisation.

Geändert von Shousté (22-08-2007 um 09:24 Uhr)
Shousté ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele