rekursive funktion
klaus
- javascript
Hi,
ich habe Probleme mit folgender Funktion:
function do_parsefiles(i) {
var Anzahl = document.getElementById("name_list").childNodes.length - 1;
var val = document.getElementById("name_list").childNodes[i].id;
var res = document.getElementById("fileInfo");
var info = document.getElementById("fileInfo").innerHTML;
res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
remote.parsefile(val);
if(i < Anzahl) {
window.setTimeout( "do_parsefiles(i++)", 10 );
}
else
res.innerHTML = i + '<br>FINISHED';
}
Wenn ich diese Funktion mit einem do_parsefiles('0') aufrufe, bekomme ich immer am anfang 2x das 1. Childelement, bei einem Aufruf mit do_parsefiles(1), beginnt die Geschichte auch mit dem Element Nr 1, springt dann aber wieder 2x auf die Null.
Um Hilfe wäre ich sehr dankbar
Gruß Klaus
Hi klaus,
window.setTimeout( "do_parsefiles(i++)", 10 );
Wie kommst du auf die Idee, dass hier das i bei i++ durch den wirklichen Wert von i ersetzt werden soll? Dann müssen ja das i in parsefiles auch ersetzt werden *g*
Und wenn du nicht weißt wovon ich rede, dann würde ich dir empfehlen noch mal Zeichenketten-Verknüpfung nachzulesen - oder auf Englisch: string concatenation.
Viele Grüße aus Kanada,
~ Dennis.
Hallo,
window.setTimeout( "do_parsefiles(i++)", 10 );
mit anderen Worten,
window.setTimeout( "do_parsefiles("+(i++)+")", 10 );
sollte es tun (ungeprüft)
(In perl und php gehen solche Geschichten (Variablen in Strings erkennen), in javascript nicht)
Gruß, Nils
hi,
window.setTimeout( "do_parsefiles("+(i++)+")", 10 );
hmm hier geht denn alles mit i=0 durch :(
Hallo,
Hast Du das Script selbstgeschrieben?
Ich hab keine Lust, ein geklautes Script zu korrigieren.
Nur soviel:
"An setTimeout() gekoppelte Funktionsaufrufe können auch Parameter enthalten. Berücksichtigen Sie dabei, DASS LOKALE VARIABLE DANN NICHT MEHR ZUR VERFÜGUNG STEHEN. Eine Übergabe der Werte mittels Zeichenkettenverknüpfung ist jedoch jederzeit möglich."
Diesen Satz verstehe ich von der Logik her auch nicht so recht. Aber vermutlich heißt das, das Du i global in deinem Script verfügbar machen solltest
Gruß, Nils
hi
Hast Du das Script selbstgeschrieben?
Ich hab keine Lust, ein geklautes Script zu korrigieren.
Gäähn dann lass es, es ist selbst geschrieben ...
Wenn ich scripte klauen würde, denn klau ich welche die auch funktionieren ;-)
Hallo,
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="content-language" content="de" />
<title>Test Rekursion</title>
</head>
<body>
<p id="countdown">10... </p>
<script type="text/javascript">
~~~~~~javascript
/* <![CDATA[ */
x=9;
rek(x);
function rek(x) {
meinText=document.createTextNode(x+"... ");
document.getElementById("countdown").firstChild.appendData(meinText.nodeValue);
if(x > 0) window.setTimeout("rek("+(x-1)+")",20);
}
/* ]]> */
~~~~~~html
</script>
</body>
</html>
ist Standardkonform, funktioniert bei mir im Firefox. Für andere Browser keine Garantie :-)
Gruß, Nils
p.s. Weiß jemand, wieso die Javascript-Konsole im Firefox meckert, wenn ich das script auslagere????? Fehlermeldung: "document.getElementById("hallo") has no properties (...)"
hi,
p.s. Weiß jemand, wieso die Javascript-Konsole im Firefox meckert, wenn ich das script auslagere????? Fehlermeldung: "document.getElementById("hallo") has no properties (...)"
Weil es durch das Auslagern vermutlich, wie so oft, zu früh zur Ausführung kommt - zu einem Zeitpunkt, wo noch kein Element mit der ID "hallo" im Dokumentenbaum existiert.
gruß,
wahsaga
Hallo,
stimmt... scriptreferenz war im Kopf der Datei definiert... :-/
Danke und Gruß, Nils
Hallo,
Toll, Ich schreibe ihm sein Script und er ist weg, ohne was zu sagen :-/
Gruß, Nils
Hallo .nils.!
und er ist weg, ohne was zu sagen :-/
Tja, das ist das Schicksal eines jeden Helfers hier... Hier ist es zwar nicht allzuoft der Fall, aber im frz. Forum eher zu beobachten: Leute stellen eine Frage, lassen sich danach nie wieder blicken.
Nicht ärgern, trotzdem antworten. Im Archiv wird Dein Script zu finden sein, falls noch jemand ein ähnliches Problem hat!
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo,
Stimmt auch wieder, nichts ist umsonst...
Gruß, Nils
Hi Nils,
Hallo,
Toll, Ich schreibe ihm sein Script und er ist weg, ohne was zu sagen :-/
hmm hattee geschrieben dass ichs hinbekommen hab, hast du denn wohl überlesen, trotzdem danke :)
Hi
Diesen Satz verstehe ich von der Logik her auch nicht so recht. Aber vermutlich heißt das, das Du i global in deinem Script verfügbar machen solltest
<!--
function go() {
i=1;
tes(i);
}
function tes(i) {
var end = 10;
var inh = document.getElementById('oo').innerHTML;
document.getElementById('oo').innerHTML = inh + "<br>" + i;
if(i <= end)
window.setTimeout("tes(i++)",20);
}
go();
-->
in go ist nu i global gemacht ...
geht aber trotzdem net ... Kommt das raus:
1
1
2
3
4
5
6
7
8
9
10
11
... wollt ich nur noch sagen
Gruß Klaus
Hi,
function go() {
i=1;
Hier hast Du zwar ein globales i.
function tes(i) {
Aber das i innerhalb der Funktion ist der funktions-lokale Parameter, nicht die globale Variable.
in go ist nu i global gemacht ...
Ja, aber in tes nicht.
cu,
Andreas
Hi,
Wie kommst du auf die Idee, dass hier das i bei i++ durch den wirklichen Wert von i ersetzt werden soll? Dann müssen ja das i in parsefiles auch ersetzt werden *g*
Es klappt ja bei allen 114 Durchläufen, nur die ersten beiden werden mit i=0 ausgegeben, alle weiteren folgen dann mit i=1,i=2,u.s.w.
Ich weiss etz net was das mit Zeichenketten-Verknüpfung zu tun haben soll ...
Meine Annahme wäre ja, dass am anfang i als sting vorhanden ist, um das i++ durchzuführen muss es aber ein integer sein ...
Gruß Klaus
Hallo.
Könntest Du mir einmal verraten, was Du eigentlich machen willst?
res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
Hier überschreibst Du den Inhalt jedesmal? Absicht? Oder sollte das eine Art Liste werden ala:
res.innerHTML = res.innerHTML + info + '<br>' + i + '/' + Anzahl + '-' + val;
remote.parsefile(val);
Was wird hier eigentlich aufgerufen, ist das wichtig?
window.setTimeout( "do_parsefiles(i++)", 10 );
Wiso eigentlich so und nicht mit einer for- oder while-Schleife über den ChildNodes-Array?
Viele Grüße
Michael
Hallo.
Könntest Du mir einmal verraten, was Du eigentlich machen willst?
Ich will eine Liste mit mp3 Daten auslesen, und per Ajax die Header dateien bekommen ... Die Liste hab ich schon, das Problemscript soll die Liste durchlaufen
res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
Hier überschreibst Du den Inhalt jedesmal? Absicht? Oder sollte das eine Art Liste werden ala:
res.innerHTML = res.innerHTML + info + '<br>' + i + '/' + Anzahl + '-' + val;
Das ist nur eine Kontrollausgabe
remote.parsefile(val);
Das ist die Ajax Funktion
window.setTimeout( "do_parsefiles(i++)", 10 );
Wiso eigentlich so und nicht mit einer for- oder while-Schleife über den ChildNodes-Array?
Nicht über eine Schleife, denn dakann ich nichts auf den Bildschirm ausgeben, denn ich möchte jedesmal wenn icheines der mp3 - Files parse ausgeben welches gerade geparst wird ....
Gruß Klaus
Hi,
habs gelöst ...
zwar net grad elegant, aber es geht, .. habe nun ein feld angelegt, aus welchen ich mir i auslese, um 1 erhöhe und in das feld schreibe, bei jedem durchgang
Gruß Klaus