Jquery und setTimeout - kann das funktionieren?
ralphi
- javascript
Hi zusammen,
eigentlich ne Anfängerfrage.
warum greift das Intervall in msec nicht?
Im Zusammenspiel mit JQuery hab ich setTimeout noch nicht eingesetzt.
Ich habe 5 Bilder und möchte sie nacheinander mit fadeeffekt einblenden. Die Funktion rast einfach durch, egal welchen Wert ich als intervall angebe.
$('#garten2').hide();
$('#garten3').hide();
$('#garten4').hide();
$('#garten5').hide();
var x=1;
function Bilderschleife ( bild1,bild2) {
$(bild1).fadeOut(500);
$(bild2).fadeIn(500);
x++;
if (x >= 6) {x=1;}
bild1="#garten"+x;
bild2="#garten"+(x+1);
setTimeout(Bilderschleife( bild1,bild2),10000);
}
Bilderschleife(1, "#garten1","#garten2");
Was mach ich falsch?
Viele Grüße aus LA
Hallo,
setTimeout(Bilderschleife( bild1,bild2),10000);
setTimeout erwartet eine Funktion (ein Funktionsobjekt).
Hier übergibst du setTimeout allerdings den Rückgabe des Funktionsaufrufs Bilderschleife(…). Das ist allem anscheind nach undefined (die Funktion hat keinen Rückgabewert).
Hier wird also letztlich setTimeout(undefined, 10000);
ausgeführt – das hat natürlich keine Wirkung.
Entweder kannst du eine anonyme Funktion übergeben:
setTimeout(function() {
Bilderschleife(bild1, bild2);
}, 10000);
Oder du erzeugst eine neue Funktion mit Function#bind(), die das Original mit vordefinierten Parametern aufruft:
setTimeout(Bilderschleife.bind(undefined, bild1, bild2), 10000);
Das geht in neueren Browsern (ECMAScript 5) und das Konzept nennt sich Currying in der funktionalen Programmierung.
Mathias
Meine Herren,
Ergänzend: Der initiale Funktionsaufruf bekommt falsche Argumente übergeben:
Bilderschleife(1, "#garten1","#garten2");
sollte glaube ich sein:
Bilderschleife("#garten1","#garten2");
hi,
Ergänzend: Der initiale Funktionsaufruf bekommt falsche Argumente übergeben:
durch die rumprobiererei - auch das mit dem x ist so nicht ganz korrekt (schließt so am ende das letzte bild nicht)
aber jetzt läufts - danke
Viele Grüße aus LA
Hi Mathias
Entweder kannst du eine anonyme Funktion übergeben:
setTimeout(function() {
Bilderschleife(bild1, bild2);
}, 10000);
>
funktioniert - danke
wenn ich dich richtig verstehe, muss die function irgendeinen return haben - wieder was gelernt ;-)
Viele Grüße aus LA
--
ralphi
Hallo,
wenn ich dich richtig verstehe, muss die function irgendeinen return haben - wieder was gelernt ;-)
nein, diese Erkenntnis ist so nicht richtig. Eine Funktion darf gern ohne ein Funktionsergebnis enden. Aber wenn ein Funktionsaufruf in einem Ausdruck enthalten ist, dann wird an der Stelle das Funktionsergebnis weiterverarbeitet. Wenn die Funktion keins liefert, ist das dumm.
Aber auch wenn es rein von der Programmlogik her nicht erforderlich ist, dass eine Funktion noch ein Ergebnis zurückliefert, gilt es als guter Stil, das trotzdem zu tun. Und sei es ein boolsches Ergebnis oder ein Fehlercode, der den Aufrufer über Erfolg oder Misserfolg informiert.
Man kann das Funktionsergebnis ja dann immer noch ignorieren, wenn man meint, man bräuchte es nicht.
Ciao,
Martin
Hi,
Aber auch wenn es rein von der Programmlogik her nicht erforderlich ist, dass eine Funktion noch ein Ergebnis zurückliefert, gilt es als guter Stil, das trotzdem zu tun. Und sei es ein boolsches Ergebnis oder ein Fehlercode, der den Aufrufer über Erfolg oder Misserfolg informiert.
Man kann das Funktionsergebnis ja dann immer noch ignorieren, wenn man meint, man bräuchte es nicht.
stimmt - ich hab eigentlich immer funktionen, mit prozeduren (vb6) verwechselt. wenn man sich halt alles selber aneignet .. ;-)
Viele Grüße aus LA