molily: Funktion allen Button zuweisen.

Beitrag lesen

Hallo,

Wenn der Button auf inaktiv gesetzt wird,
wird ja die Ablaufende Zeit,
auf dem Button angezeigt von 1000 - 0.
Wie bekomme ich aber nur die 100 Schritte angezeigt?
Also das es so aussehn würde,
als würde er von 10 nach 0 zählen?

setTimeout("delayedSubmit('" + id + "', " + (secs - 1) + ")");

Du rufst hier setTimeout mit nur *einem* Parameter auf. Der zweite Parameter fehlt. Dass das überhaupt funktioniert, ist bemerkenswert. Vermutlich nimmt der Browser irgendeinen Standardwert.

Was du momentan machst, ist delayedSubmit eintausend Mal nacheinander auszuführen mit setTimeout, aber ohne angegebener Wartezeit. Was dabei herauskommt, ist überhaupt nicht absehbar und dass es ungefähr 10 Sekunden zu dauern scheint, ist wohl auch eher willkürlich. Die »Verzögerung« kommt eher dadurch, dass die wiederholte Ausführung des Codes halt eben soviel Rechenzeit verbrät...

Du musst schon einen zweiten Parameter bei setTimeout angeben.
Sinnvollerweise berechnest du die angezeigte Wartezeit nicht über den setTimeout-Wert. Ich würde das so lösen:

<form action="...">  
<input type="submit" value="Download" onclick="window.open(...); delayedSubmit(this); return false;" />  
</form>  
  
<script type="text/javascript">  
[code lang=javascript]function delayedSubmit (buttonElement, seconds) {  
 // die Funktion nimmt ein Element entgegen, deshalb oben beim Aufruf die Übergabe von this, das ist das input-Element  
 // Beim ersten Aufruf ist der Parameter seconds nicht gesetzt, also setzen wir ihn auf 10 Sekunden, die Dauer der Wartezeit  
 if (seconds == undefined) {  
  seconds = 10;  
  // Element ausgrauen  
  buttonElement.disabled = true;  
 }  
 if (seconds > 0) {  
  buttonElement.value =  "Bitte Warten (" + seconds + ")";  
  // Bei jedem Aufruf wird seconds um 1 vermindert  
  seconds -= 1;  
  // Verbesserter setTimeout-Aufruf.  
  // Das ist im Grunde dasselbe wie in deinem Code, nur wird eine anonyme Funktion übergeben anstelle eines zusammengebauten Strings. Darin sind die Variablen buttonElement und seconds verfügbar, sodass delayedSubmit mit diesen als Parameter erneut aufgerufen werden kann. Das ist etwas komfortabler. Und natürlich der zweiter Parameter, 1000 Millisekunden, d.h. eine Sekunde.  
  window.setTimeout(  
   function () {  
    delayedSubmit(buttonElement, seconds);  
   },  
   1000  
  );  
 } else {  
  // Wie gehabt  
  buttonElement.disabled = false;  
  buttonElement.value =  "Download";  
  buttonElement.form.submit();  
 }  
}

</script>[/code]

Mathias