• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

übergabewert in rekursiver funktion

flexi

Lounge-Member
ich habe ein kleines aber ziemlich gemeines Problem:

ich habe eine Funtion mit einem Übergabewert (Name eines Arrays), die sich selber mit dem gleichen Übergabewert duch einen Timeout wieder aufruft

function ticker_auf(name)
{
if(alle_ticker[name]["zaehler"]>100)
{
...
...[nicht weiter wichtig was hier steht]
...
alle_ticker[name]["zaehler"]--;
setTimout("ticker_auf(name)",30)
}
}

bei dieser Funktion sagt er mir beim 2.ausführen, dass 'name' nicht definiert ist. - wenn ich allerdings vorher so tu:

var Name;
function ticker_auf(name)
{
if(alle_ticker[name]["zaehler"]>100) //alle_ticker ist ein mehrdimensionales Array
{
...
...[nicht weiter wichtig was hier steht]
...
alle_ticker[name]["zaehler"]--;
Name = name; //den lokalen Übergabewert in eine globale Variable schreiben
setTimout("ticker_auf(Name)",30);
}
}

Wenn ich also den Übergabewert zwischnespeichere in einer globalen Variable, dann gehts! nur dummerweise, will ich vielleicht auch mehrere Instanzen dieser Funktion laufen lassen. (die verschiedenen Zähler stören einander)

Meine Frage: wie kriege ich lokale Variablen mit 'nem setTimeout in einer Funktion übergeben und nicht bloß globale Variablen - oder zumindest die funktion so hingebastelt, dass sich mehrere Instanzen nicht stören?
Ich weiß ich könnte auch für jeden einzelnen Ticker eine eigene Funktion schreiben, aber das ist mir irgendwie zu umständlich :)

Danke, Felix
 
Dein Problem liegt darin, daß "ticker_auf(name)" ein String ist. name wird in diesem Fall nicht ausgewertet und enthält somit nicht das, was Du erwartest.

setTimeout erwartet als ersten Parameter einen Ausdruck....

also solltest Du entweder nur mit einer globalen Variablen arbeiten, oder "ticker_auf (\"" + name + "\")" benutzen, dann wird der Name ausgewertet und übergeben..... (ob das funzt hab ich aber nicht getestet.... is nur geraten :) )
 
ich denke es klappt so:

das problem ist wirklich, dass man die variablen unter Umständen "zwischenspeichern" muss, also einfach nur wie du es getan hast: Name = name;

ich weiss zwar nicht, wie du das mit den instanzen löst, ohne besondere variable aber probier doch mal so:


// var Name; --- kannst du weglassen Jscript definiert immer alles selbst, ausser arrays

function ticker_auf(name,instance)
{
myName = name;
myInstance = instance;
mySpeed = 30;

if(alle_ticker[name]["zaehler"]>100)
{
...
...[nicht weiter wichtig was hier steht]
...
alle_ticker[name]["zaehler"]--;

window.setTimout("ticker_auf("+Name+","+myInstanz+")",mySpeed);
}
}


aufruf:
ticker_auf("blabla","instanz1");
ticker_auf("blabla","instanz2");

ticker_auf("blabla","instanzn");

ich hätte eine verbesserung für dich:
scheinbar zählst du entweder die buchstaben oder so in dem array mit, das brauchst du aber nicht, es gibt ja icht für umstant rekursive aufrufe:

function ticker_auf(name,instance,position)
{
myName = name;
myInstance = instance;
myPosition = position;
mySpeed = 30;

if(myPosition>100)
{
...
...[nicht weiter wichtig was hier steht]
...
myPosition--;

window.setTimout("ticker_auf("+Name+","+myInstanz+","+myPosition+")",mySpeed);
}
}

aufruf dann mit:

ticker_auf("blabla","instanz1",Position (ZB 200 oder so));

ticker_auf("blabla","instanz2",200);

bei fragen - mail mir einfach oder so
 
das problem bleibt damit ungefähr das selbe: wenn ich die Funktion jetzt durch eine 2.instanz aufrufe, während die erste noch läuft, wird die variable myName überschrieben und das ganze ding kommt durcheinander.
 
also ich versteh die (js)welt nicht mehr. ich hab in der Schule aus Langeweile nochmal probiert -> Skript nochmal ausm Gedächtnis getippst: Siehe da! Es funktioniert... allerdings stehe ich jetzt trotzdem noch vor einem anderen Problem. Der Übergabewert wird nun zwar richtig übergeben, allerdings beeinflussen sich die verschiedenen Instanzen trotzdem noch aus mir erstmal unerfindlichen Gründen - Vielleicht könnt ihr euch den Quelltext ja auch mal angucken...
Hier gehts zum Quelltext
:) Danke :)
 
so gehts

du hattest beim rekursiven aufruf vergessen, “name” als variable zu übergeben, da ist dann dein script durcheinandergekommen :)

setTimeout("ticker_auf('"+name+"')",5);
setTimeout("ticker_zu('"+name+"')",5);

so siehts dann richtig aus:

<html>
<head>
<title>
Schreibmaschine
</title>
<style type="text/css">
a:link { text-decoration:none; }
a:visited { text-decoration:none; }
a:hover { text-decoration:none; }
a:active { text-decoration:none; }
</style>
<script>

var alle_ticker = new Array()
var j=1
function neuer_ticker(text1,text2)
{
name = "ti"+j; j++;
alle_ticker[name]=new Array();
alle_ticker[name]["text1"]=text1;
alle_ticker[name]["text2"]=text2;
alle_ticker[name]["zaehler"]=0;
document.write("<p id='"+name+"' onmouseover=ticker_auf('"+name+"') onmouseout=ticker_zu('"+name+"')>"+alle_ticker[name]["text1"]+"</p>");
}

function ticker_auf(name)
{
clearTimeout(alle_ticker[name]["zu"]);
if(alle_ticker[name]["zaehler"]<alle_ticker[name]["text2"].length)
{
alle_ticker[name]["zaehler"]+=2;
document.all[name].innerText = alle_ticker[name]["text2"].substring(0,alle_ticker[name]["zaehler"]);
alle_ticker[name]["auf"] = setTimeout("ticker_auf('"+name+"')",5)
}
}

function ticker_zu(name)
{
clearTimeout(alle_ticker[name]["auf"]);
if(alle_ticker[name]["zaehler"]>0)
{
alle_ticker[name]["zaehler"]-=2;
document.all[name].innerText = alle_ticker[name]["text2"].substring(0,alle_ticker[name]["zaehler"]);
alle_ticker[name]["zu"] = setTimeout("ticker_zu('"+name+"')",5)
}else
{
document.all[name].innerText = alle_ticker[name]["text1"];
}
}

</script>
</head>
<body bgcolor=#FFFFAA>
<script>
neuer_ticker("obs wohl klappt?","Wahnsinn!");
neuer_ticker("Test numero 2","Unglaublich!");
neuer_ticker("soll ich für heute erst mal schluss machen?","Nöö - jetzt mach gefälligst weiter!");

</script>
</body>
</html>
 
Zurück
Oben