Funktionsaufruf in Schleife bricht ab

WorldsBestKiller

Grünschnabel
Hi

dieses mein neuestes Problem klingt ein wenig seltsam :
Ich durchlaufe in ner Schleife einen Array und rufe bei jedem Wert eine andere Funktion mit ebendiesem Wert als Parameter auf ("ShowIndex"). Allerdings reagiert der Sauhund (Entschuldigung, Netiquette, ich weiss) ein wenig anders als gedacht :

Die Schleife wird einmal durchlaufen, dann mit dem ersten Wert die andere Funktion aufgerufen, dann kommt er wieder zurück und läuft die Schleife (immer noch im ersten Durchlauf) zu Ende und springt dann aber raus, obwohl noch Elemente im Array stecken.

Code s.u.

Code:
for (j=0;j<SIArray.length;j++) {
                             tempObjekt = SIArray[j];
			alert ("schleife#"+tempObjekt)
			ShowIndex(tempObjekt,modus,PorM);	
		}

Weiss jemand worans hakt

Thx im Voraus
Gruss Basti
 
Naja ein bisschen mehr Code währe wünschenswert gewesen aber schauen wir mal was meine Glaskugel so alles her gibt ;)

Erst einmal finde ich persönlich nicht so gut das du ein alert Objekt in deiner Schleife hast. Dir ist bekannt, dass er dir solang wie das Array ist, dir sooft auch eine Meldung ausgibt inder jedesmal der Code bis zum schliessen gestoppt wird?

Es muss weiterhin hinter dem alert Objekt ein ";", aber wir wollen ja mal nicht kleinlig sein ;-)

Ähm zu deinen Problem...
Versuche es doch mal mit eval(tempObjekt); nachdem du die Parameter der Variable übergeben hast. Es kann sein das es daran liegt.

Das er die schleife nur einmal durchgeht kann weiterhin daran liegen das deine Zweite Funktion irgendwo ein break oder andere Befehle besitzt was zum Abbruch der Schleife führen kann.

Eine weitere Möglichkeit zur Problemlösung könnte sein das, dass Array eben nur eine Größe von 1 hat.

Überprüfe dies dadurch, dass du document.write(SIArray[j]); in deine for Schleife mit hineinpackst.
 
Tach

Ich habe mal die Funktion ShowIndex auskommentiert und es lief.
Ich denke, dass der Funktionsaufruf nicht ganz korrekt ist, bzw. die Funktion Showindex ne Macke hat.
Javascript bricht dann irgendwie ab.

Kannst ja mal die Funktion posten...

Hoffe, das hilft dir etwas weiter...

MfG

Ollek81

edit: ups, da war einer schneller...:-)
 
Danke, ihr überschlagt euch ja mit Antworten...

Nun zum Inhalt :

@Krypthonas :

Der Alert ist nur drin um zu sehen bei welchem Element abgebrochen wird (Self-Debugging quasi ;))

Eval(tempObjekt); bringt nix, was macht dieser Befehl

Das Array hat auf jeden Fall mehrere Elemente, habs getestet.

Die Funktion ShowIndex hat in der Tat zwei mal ein break in ner For-Schleife, geht nich anders. Allerdings funktioniert sie für sich alleine wunderbar. Und nach dem ersten Ausführen kommt er ja wieder in die Schleife zurück (hab ich mit alerts geprüft) nur springt er dann raus ohne weiterdurchzulaufen. Auch ein continue; hilft nicht weiter...

@Ollek :
siehe oben


Eigentlich absolut unlogisches Verhalten, diese Schleife treibt mich noch in den geistigen RUIN..
 
Naja ohne mehr Code geht nix ;-)

Was ich dir empfehlen würde ist, deine Funktion die in der Schleife ist so zu gestalten das kein break; vorhanden ist. Verstehe mich nicht falsch.

Du sollst sie nur zu Testzwecken deaktivieren bzw. umgestalten.
Wenn dann die Schleife läuft, dann weist du das es an den breaks; gelegen hat.

In diesem Sinne
 
Ihr wollt mehr Code? Hier ist mehr Code :

Dies ist die ganze ShowIndex :

Code:
function ShowIndex (myIndex, modus, PorM) {
		
	parent.navigator_frame.Menue1.style.visibility = 'hidden';
	
	var layers = parent.navigator_frame.document.getElementsByTagName("div");
	var aktLayer = layers	[myIndex];
	var parenttopdistance = Math.abs(aktLayer.style.top.substring(0,aktLayer.style.top.length-2));
	parenttopdistance = parenttopdistance +Math.abs(aktLayer.style.height.substring(0,aktLayer.style.height.length-2));
	
	var counter = 0;
	var counter1 = 0;
	var FinishIndex =  layers.length - 1;
	var tempTopdistance = 0;
	var tempEbene = 0;
	var tempEbene2 =0;
	var tempEbene2 =0;
	
	//hat der Knoten überhaupt Childs? - Test über Ebene von nachfolgendem Knoten
	var aktLayerEbene = parent.navigator_frame.document.forms[myIndex].stufe.value;	
	var nextIndex = Math.abs(myIndex)+1;			
	var nextLayerEbene =parent.navigator_frame.document.forms[nextIndex].stufe.value;
	
	for (s=0;s<layers.length;s++) {
		parent.navigator_frame.MM_swapImage("pic" +s,'','bilder/pic_folderclosed.gif',1);
	}
	parent.navigator_frame.MM_swapImage("pic" +myIndex,'','bilder/pic_folderactive.gif',1);
	
	if (nextLayerEbene > aktLayerEbene) {
		
		//Childs geschlossen?
		if (layers[nextIndex].style.visibility == 'hidden') {
			
			// Bild von Plus auf Minus(SwapImage + -> -)
			parent.navigator_frame.MM_swapImage("plusminus" +myIndex,'','bilder/pic_minus.gif',1);
			
			// bis zum nächsten Knoten mit gleicher oder kleinerer Ebene alle divs einblenden
			for (i=nextIndex; i<layers.length;i++) {
				if (layers[i].id.substring(0,1) =="d") {
					tempEbene = parent.navigator_frame.document.forms[i].stufe.value;
					if (tempEbene == nextLayerEbene)  {
						// Childs einblenden
						var aktLayer2 = layers[i];
						aktLayer2.style.visibility = 'visible';
						aktLayer2.style.zIndex = 200 ;
						
						tempTopdistance = counter +parenttopdistance;
						aktLayer2.style.top = tempTopdistance+"px";
						counter = counter + 18;																	
					}
					else if (tempEbene > nextLayerEbene) {
//						// SubChilds ausblenden
//						// topdistance dekrement
					}
					else {
						FinishIndex = i;
						break;
					}
				}
			}
			
			//Knoten ab dem nächsten auf der aktlayer- Ebene nach unten rücken 
			for (j=FinishIndex;j<layers.length;j++) {
						
				if (layers[j].id.substring(0,1) =="d") {
					
					var aktLayer3 = layers[j];
					tempTopdistanceString = aktLayer3.style.top;
					tempTopdistanceString = tempTopdistanceString.substring(0,tempTopdistanceString.length-2);
					tempTopdistance = Math.abs(tempTopdistanceString);
					tempTopdistance = tempTopdistance + counter;
					aktLayer3.style.top = tempTopdistance+"px";
				}		
			}		
		}
		
		//Childs offen?
		else if (layers[nextIndex].style.visibility == 'visible') {
			
			var OverNextIndex = 0;
			
			//Bild von Minus auf Plus(SwapImage + -> -)
			parent.navigator_frame.MM_swapImage("plusminus" +myIndex,'','bilder/pic_plus.gif',1);
			
			// bis zum nächsten Knoten mit gleicher oder kleinerer Ebene alle divs ausblenden
			for (i=nextIndex; i<layers.length;i++) {
				if (layers[i].id.substring(0,1) =="d") {
					tempEbene = parent.navigator_frame.document.forms[i].stufe.value;
					
					if (tempEbene > nextLayerEbene) {
						OverNextIndex = i;
					}
					
					if (tempEbene == nextLayerEbene)  {
						// Childs ausblenden
						parent.navigator_frame.MM_swapImage("plusminus" +i,'','bilder/pic_plus.gif',1);
						var aktLayer2 = layers[i];
						aktLayer2.style.visibility = 'hidden';
						aktLayer2.style.zIndex = -3 ;
						
						tempTopdistance = counter - parenttopdistance;
						aktLayer2.style.top = tempTopdistance+"px";
						counter = counter + 18;																	
					}
					else if (tempEbene > nextLayerEbene &&OverNextIndex != 0) {
						
						if (layers[OverNextIndex].style.visibility == 'visible') {
							parent.navigator_frame.MM_swapImage("plusminus" +i,'','bilder/pic_plus.gif',1);
							var aktLayer3 = layers[i];
							aktLayer3.style.visibility = 'hidden';
							aktLayer3.style.zIndex = -3 ;
							
							tempTopdistance = counter - parenttopdistance;
							aktLayer3.style.top = tempTopdistance+"px";
							counter = counter + 18;
						}
					}
					else {
						FinishIndex = i;
						break;
					}
				}
			}
			
			//Knoten ab dem nächsten auf der aktlayer- Ebene nach oben rücken 
			for (j=FinishIndex;j<layers.length;j++) {
						
				if (layers[j].id.substring(0,1) =="d") {
					
					var aktLayer3 = layers[j];
					tempTopdistanceString = aktLayer3.style.top;
					tempTopdistanceString = tempTopdistanceString.substring(0,tempTopdistanceString.length-2);
					tempTopdistance = Math.abs(tempTopdistanceString);
					tempTopdistance = tempTopdistance - counter;
					aktLayer3.style.top = tempTopdistance+"px";
				}		
			}		
		
		}
	}
	else if (!nextLayerEbene) {	
		parent.navigator_frame.MM_swapImage("plusminus" +myIndex,'','bilder/pic_blank.gif',1);
	}
	else {	
		parent.navigator_frame.MM_swapImage("plusminus" +myIndex,'','bilder/pic_blank.gif',1);
	}	
	
	//Funktionalität aufrufen
	if (modus == "leftClick") {
		if (PorM == 'M') {
			CallContent(myIndex,'Media');
		}
		else if (PorM == 'P') {			
		}	
	}
	else if (modus == "rightClick") {
		CallContent(myIndex,'Menu');
	}
}

Und das ist die aufrufende Refresh Funktion :

Code:
function RefreshNeueNavigation (myIndex,modus,PorM) {
	
	var layers = parent.navigator_frame.document.getElementsByTagName("div");
	var SIArray = new Array();
	SIArray.push(myIndex);
	var tempStufe;
	var tempObjekt;
	
	if (layers[myIndex].style.visibility == 'hidden') {
		
		var aktStufe = parent.navigator_frame.document.forms[myIndex].stufe.value;
		
		for (i=myIndex; i>=0; i--) {
			
			tempStufe =  parent.navigator_frame.document.forms[i].stufe.value;
				
			if (tempStufe<aktStufe) {
				if (layers[i].style.visibility == 'hidden'){
					SIArray.push(i);
				}
				else if (layers[i].style.visibility == 'visible'){
					SIArray.push(i);
					break;
				}
				aktStufe = tempStufe;
			}
		}
		SIArray.reverse();	
			
		for (j=0;j<SIArray.length;j++) {
			eval("tempObjekt = "+SIArray[j]+";");				
			ShowIndex (tempObjekt, 'leftClick', 'P');
			alert(tempObjekt);
		}
	}
	else {
		ShowIndex(myIndex,modus,PorM);
	}
}

Das ganze ist Teil einer Navigation für ein InternetFrontend. Bei einem Refresh soll der Baum wieder an der selben Stelle geöffnet werden.

Hope that helps you to help me
 
Versuch doch mal die Variable j vor der Schleife bekannt zu machen und merke dir das Ende des Arrays

var j=0;
var ende = SIArray.length;
for ( j=0; j < ende; j++)
...

vielleicht "vergißt" er in der Funktion irgendwie die Variablen?
vop
 
Spitze vielen Dank

der Zigeuner hat wirklich durch den Aufruf die Variablen vergessen.
Jetzt läufts wunderbar, sorry an das Board für den Riesen-Code .. ;)

Thx euch allen und schöne Woche
 

Neue Beiträge

Zurück