Zum Inhalt springen

setTimeout


etreu

Empfohlene Beiträge

Bei mir funktioniert die Verzögerung nicht. Wer weiss warum?

Code:

<script type="text/javascript">

<!--

var i;

function leer()

{

//leer

}

function down()

{

i=-150;

for (i=-150; i<0; i++)

{

document.all.tosee.style.top=i;

setTimeout('leer()',250);

}

}

function up()

{

i=0;

for (i=0; i>-150; i--)

{

document.all.tosee.style.top=i;

setTimeout('leer()',250);

}

}

//-->

</script>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von E-T

Bei mir funktioniert die Verzögerung nicht. Wer weiss warum?

Die Frage ist, was willst du erreichen? Anscheinend möchtest Du, dass dein Timeout und die leer() eine Pause machen, das tun sie aber nicht. Lies einmal in SelfHTML nach:

http://selfhtml.teamone.de/javascript/objekte/window.htm#set_timeout

Die Timeout-Funktion führt einen bestimmten Befehl (den ersten Parameter) nach n Millisekunden (den zweiten Parameter) aus.

In deinem Code wird also nach einer Viertelsekunde eine leere Funktion ausgeführt, was sich natürlich nicht bemerkbar macht.

wie wäre es damit:

function down( i ) {

i --;

if ( i > 0 ) {

document.all.tosee.style.top = i;

setTimeout( "down(" + i + " );", 250 );

} else {

alert( "fertig" );

}

}

down( -150 ); // starten

Im übrigen funktioniert document.all NUR im Internet Explorer. Andere Browser quittieren das mit einem JS-Fehler.

Gruss

Matze

Link zu diesem Kommentar
Auf anderen Seiten teilen

1. Beim Aufruf der leeren Funktion soll einfach nur eine Verzögerung erreicht werde.

2. Bei 150 Aufrufen macht sich die Verzögerung doch schon bemerkbar (außerdem ändert sich nichts bei der Änderung der Zeit auf 1000ms).

3. Beim Aufruf der Funktion aus der Funktion gab es einen Stack-Overflow.

Wie ihr seht alles schon durch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von E-T

1. Beim Aufruf der leeren Funktion soll einfach nur eine Verzögerung erreicht werde.

2. Bei 150 Aufrufen macht sich die Verzögerung doch schon bemerkbar (außerdem ändert sich nichts bei der Änderung der Zeit auf 1000ms).

3. Beim Aufruf der Funktion aus der Funktion gab es einen Stack-Overflow.

Wie ihr seht alles schon durch.

Ich fürchte, Du hast dir weder selfHTML noch meine Ausführungen durchgelesen. Daher ein letzter Versuch:

setTimeout führt nach einer bestimmten Zeitspanne einen bestimmten JavaScript-Code aus. Das heißt aber *nicht*, dass der restliche Code auf dessen Ausführung wartet. Es wird einfach nur ein Timer gestartet, nach dessen Ablauf - während des weiteren Ablaufes der Scripte auf der Seite - etwas ausgeführt wird.

In meinem Beispiel war übrigens ein logischer Fehler, der Dir aber auch hätte auffallen müssen: es muss heißen i++; statt i--;

Grüße

Matze

Link zu diesem Kommentar
Auf anderen Seiten teilen

In meinem Beispiel war übrigens ein logischer Fehler, der Dir aber auch hätte auffallen müssen: es muss heißen i++; statt i--;

Das ist falsch, da die Schleife ja bis -150 läuft, ist das i-- absolut korrekt, wenn gleich vielleicht etwas unorthodox.

Nun aber zum eigentlichen Problem. Wie mein Vorredner schon erwähnte, ist die setTimeout-Funktion mitnichten eine Art "sleep"-Befehl, daß heißt, mit setTimeout eine Verzögerung zu erreichen, geht auf deine Art und Weise nicht.

for (i=-150; i<0; i++)

{

document.all.tosee.style.top=i;

setTimeout('leer()',250);

}

Diese for-Schleife läuft direkt durch - an der Stelle "setTimeout('leer()',250);" wird ein Timer gestartet, der nach 250 Millisekunden den Befehl "leer()" aufruft - aber deine for-Schleife läuft sofort weiter.

Darüberhinaus kann der Code aber ohnehin nicht funktionieren, denn document.all funktioniert nur im IE und in Opera (wenn auf IE umgestellt).

Dann aber heißt die top-Eigenschaft nicht ...style.top, sondern

...style.pixelTop.

HTH

EvilInside

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von EvilInside

Das ist falsch, da die Schleife ja bis -150 läuft, ist das i-- absolut korrekt, wenn gleich vielleicht etwas unorthodox.

Nun, das ist wohl auch nicht korrekt. Der Initialwert ist -150. Bei jedem Funktionsaufruf wird i dekrementiert. Danach wird abgefragt ob i größer 0 ist. Das kann doch so nicht gehen. Also machen wir lieber eine defakto-Schleife wie:

for ( var i = -150; i > 0; i ++ ) {}

Das meinte ich.

Darüberhinaus kann der Code aber ohnehin nicht funktionieren, denn document.all funktioniert nur im IE und in Opera (wenn auf IE umgestellt).

Nicht ganz richtig. Opera behauptet zwar, dass das Object document.all existieren würde, aber es ist nur ein funktionsloser Dummy.

So long

Matze

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Initialwert ist -150. Bei jedem Funktionsaufruf wird i dekrementiert. Danach wird abgefragt ob i größer 0 ist. Das kann doch so nicht gehen. Also machen wir lieber eine defakto-Schleife wie:

Stimmt - ich war im falschen Quelltext...

Original geschrieben von lapso

Nicht ganz richtig. Opera behauptet zwar, dass das Object document.all existieren würde, aber es ist nur ein funktionsloser Dummy.

Sorry, aber das ist definitiv falsch. Man kann über document.all genauso Layer rumschubsen, wie im Internet Explorer.

Voraussetzung ist, daß Opera sich als MSIE ausgeben soll.

Dabei gibt Opera nicht nur einen anderen UserAgent-String aus, sondern verwendet auch ein anderes DOM. Und in diesem Fall funktioniert auch document.all .

well,

EvilInside

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von EvilInside

Sorry, aber das ist definitiv falsch. Man kann über document.all genauso Layer rumschubsen, wie im Internet Explorer.

Voraussetzung ist, daß Opera sich als MSIE ausgeben soll.

Dabei gibt Opera nicht nur einen anderen UserAgent-String aus, sondern verwendet auch ein anderes DOM. Und in diesem Fall funktioniert auch document.all .

Well!

1:0 für dich, das war mir noch nicht bekannt, aber offenbar kann sogar Opera 5.12 einen <DIV> via document.all ansprechen und verschieben.

Aber jetzt kommt das Gegentor: Opera bietet nicht das komplette all-Objekt. Habe gerade mal testweise versucht, die Schriftart eines Input-Buttons via document.all zu manipulieren, nothing happens at all.

Grüße

Matthias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von lapso

Aber jetzt kommt das Gegentor: Opera bietet nicht das komplette all-Objekt. Habe gerade mal testweise versucht, die Schriftart eines Input-Buttons via document.all zu manipulieren, nothing happens at all.

Den Schuß kann ich parieren ;) :

in Opera 6 und Opera 5.12 klappt es bei mir auch mit Buttons. Allerdings streckte Opera 4.02 die Waffen.

Beispiel-Code:

im Script-Teil:

function renameBtn()

{

document.all.TestButton.value = "peter";

}

im dokument:

<input type="button" name="TestButton" value="testen">

Die Funktion habe ich über einen Textlink gestartet. Und ein Form-Tag hatte ich natürlich auch noch im Dokument :)

Trotzdem ist es gut möglich, daß Opera nicht das komplette DOM vom IE übernommen hat. Man sollte sich vielleicht nicht zu sehr darauf verlassen :cool:

so long,

EvilInside

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von EvilInside

Den Schuß kann ich parieren ;) :

Nun, den input-value zu ändern ist eine Sache, CSS-Eigenschaftem zu ändern eine andere. Position-Anweisungen kann er manipulieren, andere wiederum nicht.

Parier doch mal folgenden:

<html>

<body>

<input type="button" value="klickme" style="font-size:12px;" >

<script language="JavaScript">

document.all.tags("input")[0].style.fontSize = "30px";

</Script>

</body>

</html>

... das funzt nämlich nicht. Opera hat scheinbar, um schnell größt mögliche Kompatibilität mit proprietären Seiten herzustellen, nur die wichtigsten IE-DOM-Features umgesetzt. Nun, ich will das eigentlich nicht kritisieren.

Grüße

Matze

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von lapso

Nun, den input-value zu ändern ist eine Sache, CSS-Eigenschaftem zu ändern eine andere. Position-Anweisungen kann er manipulieren, andere wiederum nicht.

[...]

... das funzt nämlich nicht. Opera hat scheinbar, um schnell größt mögliche Kompatibilität mit proprietären Seiten herzustellen, nur die wichtigsten IE-DOM-Features umgesetzt. Nun, ich will das eigentlich nicht kritisieren.

Das ganze läßt sich in der Tat nicht umsetzen. Es hängt allerdings mit der Render-Engine von Opera zusammen, und weniger mit dem eigentlichen DOM.

Opera ist nicht in der Lage, Seiten "dynamisch" zu rendern, d.h. ein nachträgliches Manipulieren der Styles oder anderer Inhalte geht in Opera prinzipiell nicht (egal welches DOM man nun benutzt).

Das gilt übrigens auch für Layer, deren Inhalt dynamisch geschrieben wird. Das kann Opera (noch) nicht.

Man kann Layer verschieben, ein- und ausblenden, aber eben keine Inhalte nachträglich in die Seite einfügen.

Eine Ausnahme bilden u.a. Farben. Hier ein kleiner Auszug aus der Opera-Spec-Seite (http://www.opera.com/docs/specs/):

Modifying the document structure is not yet possible (ie. you cannot add or remove HTML elements). [...] Presently, we support getting and setting the following CSS attributes for absolutely positioned HTML elements:

-visibility

-pixelLeft, pixelTop

-pixelWidth, pixelHeight

-zIndex

-color, background (only for setting of colors)

Ich habe es mit der style-Eigenschaft "color" auf die Schnelle allerdings nicht hinbekommen...

Laut Opera soll aber das dynamische Verändern des Dokuments ab Version 7 möglich sein - man darf gespannt sein. :)

Du hast also Recht, daß Opera eben wirklich nicht alle Funktionen und Eigenschaften des IE document.all-Objektes übernommen hat - das liegt aber eben daran, daß Opera das technisch auch einfach nicht kann. ;)

well,

EvilInside

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von jomama

Um nochmal auf das Thema einzugehen, was willst du eigentlich mit deiner Verzögerung erreichen, E-T?

Wenn ich es richtig sehe, will er ein Layer mit der Id "tosee" nach unten bzw. oben verschieben.

Die Verzögerung braucht er, damit es eine flüssige Animation wird :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...