Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Countdown TAG, STUNDEN, MINUTEN und SEKUNDEN

5 views
Skip to first unread message

Stephan

unread,
Nov 6, 2009, 3:09:40 AM11/6/09
to
Hallo

ich habe hier ein Script das mir die Sekunden zur�ckz�hlt, allerdings ist
irgendwann die Variable "REST" bei 0, und der Counter bleibt stehen.. ;-)
Problem ist eigentlich erkannt, nur wie sol ich das Problem beheben?

Hier mein Script:
--------------------------------------------------------------
<script language="Javascript">
<!--

var REST = 100000;

var COUNTDOWNTEXT_TAG = "";
var COUNTDOWNTEXT_STUNDE = "";
var COUNTDOWNTEXT_MINUTE = "";
var COUNTDOWNTEXT_SEKUNDE = "";

var COUNTDOWN = setInterval(function(){

if(REST >= 86400)
{
var TAGE = Math.floor(REST / 86400);
REST = REST - (TAGE * 86400);

if(TAGE > 1 || TAGE == 0)
{
COUNTDOWNTEXT_TAG = TAGE + " Tage ";
}
else if(Jahre == 1)
{
COUNTDOWNTEXT_TAG = TAGE + " Tag ";
}
}


if(REST >= 3600)
{
var STUNDEN = Math.floor(REST / 3600);
REST = REST - (STUNDEN * 3600);

if(STUNDEN > 1 || STUNDEN == 0)
{
COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunden ";
}
else if(Jahre == 1)
{
COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunde ";
}
}


if(REST >= 60)
{
var MINUTEN = Math.floor(REST / 60);
REST = REST - (MINUTEN * 60);

if(MINUTEN > 1 || MINUTEN == 0)
{
COUNTDOWNTEXT_MINUTE = MINUTEN + " Minuten ";
}
else if(Jahre == 1)
{
COUNTDOWNTEXT_MINUTE = MINUTEN + " Minuten ";
}
}

if(REST > 1 || REST == 0)
{
COUNTDOWNTEXT_SEKUNDE = REST + " Sekunden ";
}
else if(REST==1)
{
COUNTDOWNTEXT_SEKUNDE = REST + " Sekunde ";
}

document.getElementById("COUNTDOWN").innerHTML = COUNTDOWNTEXT_TAG +
COUNTDOWNTEXT_STUNDE + COUNTDOWNTEXT_MINUTE + COUNTDOWNTEXT_SEKUNDE;
REST -= 1;
if(REST==0)
clearInterval(COUNTDOWN);
},1000);
//-->
</script>
---------------------------------------------------------------------------------------------


Danke


Matthias Reuter

unread,
Nov 6, 2009, 7:33:46 AM11/6/09
to
Stephan schrieb:

> ich habe hier ein Script das mir die Sekunden zurᅵckzᅵhlt, allerdings ist


> irgendwann die Variable "REST" bei 0, und der Counter bleibt stehen..
> ;-)

Hier fehlt noch die Information, dass die Anzeige bei "1 Sekunde" stehen
bleibt. Sonst wᅵre ja alles wie gewᅵnscht.

> Problem ist eigentlich erkannt, nur wie sol ich das Problem beheben?

Indem Du

> if(REST==0)
> clearInterval(COUNTDOWN);
> },1000);

ersetzt durch

> if(REST < 0)
> clearInterval(COUNTDOWN);
> },1000);


Soviel zur Beantwortung Deiner Frage. Jetzt kommen noch ein paar
Anmerkungen zum Code-Stil:

> <script language="Javascript">

Ersetze das durch <script type="text/css"> Das Attribute language ist seit
langem deprecated und wird nicht mehr benᅵtigt.

> <!--

Lass den Kommentar weg. Er war nᅵtig in Netscape 2, damit Browser, die das
Script-Tag nicht kennen, das Skript nicht als Text darstellen.
Mittlerweile kennen alle Browser das Script-Tag.

> var REST = 100000;

Es ist Konvention, Konstanten in Groᅵbuchstaben zu schreiben. Das hier
(und weiter unten) sind aber Variablen. Damit verwirrst Du andere
Entwickler mᅵglicherweise.

> var COUNTDOWNTEXT_TAG = "";
> var COUNTDOWNTEXT_STUNDE = "";
> var COUNTDOWNTEXT_MINUTE = "";
> var COUNTDOWNTEXT_SEKUNDE = "";
>
> var COUNTDOWN = setInterval(function(){
>
> if(REST >= 86400)
> {
> var TAGE = Math.floor(REST / 86400);
> REST = REST - (TAGE * 86400);
>
> if(TAGE > 1 || TAGE == 0)

TAGE ist eine Zahl, also kannst Du sie direkt mit 0 vergleichen, ohne eine
Typkonvertierung zuzulassen. Was ich meine ist: ersetze die zweite
Bedingung durch TAGE === 0, auch in den anderen Vergleichen weiter unten.

> {
> COUNTDOWNTEXT_TAG = TAGE + " Tage ";
> }
> else if(Jahre == 1)

Wo ist Jahre definiert? Ich nehme an, Du hast vergessen, das Skript an
dieser Stelle anzupassen.

> {
> COUNTDOWNTEXT_TAG = TAGE + " Tag ";
> }
> }
>
>
> if(REST >= 3600)
> {
> var STUNDEN = Math.floor(REST / 3600);
> REST = REST - (STUNDEN * 3600);
>
> if(STUNDEN > 1 || STUNDEN == 0)
> {
> COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunden ";
> }
> else if(Jahre == 1)

Auch hier.

> {
> COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunde ";
> }
> }
>
>
> if(REST >= 60)
> {
> var MINUTEN = Math.floor(REST / 60);
> REST = REST - (MINUTEN * 60);
>
> if(MINUTEN > 1 || MINUTEN == 0)
> {
> COUNTDOWNTEXT_MINUTE = MINUTEN + " Minuten ";
> }
> else if(Jahre == 1)

Und hier.

> {
> COUNTDOWNTEXT_MINUTE = MINUTEN + " Minuten ";
> }
> }
>
> if(REST > 1 || REST == 0)
> {
> COUNTDOWNTEXT_SEKUNDE = REST + " Sekunden ";
> }
> else if(REST==1)
> {
> COUNTDOWNTEXT_SEKUNDE = REST + " Sekunde ";
> }
>
> document.getElementById("COUNTDOWN").innerHTML = COUNTDOWNTEXT_TAG +
> COUNTDOWNTEXT_STUNDE + COUNTDOWNTEXT_MINUTE + COUNTDOWNTEXT_SEKUNDE;

Wenn das Laden Deiner Seite lᅵnger als eine Sekunde von hieran dauert,
kommt es hier zu einem Fehler, wenn das Element mit der ID COUNTDOWN noch
nicht existiert. Eine Lᅵsung wᅵre, die anonyme Funktion aus dem
setInterval herauszuholen

var displayRemainingTime = function () {
// ...
};

und dann ᅵber

<body onload="var COUNTDOWN = window.setInterval(displayRemainingTime,
1000);">

zu starten.

> REST -= 1;
> if(REST==0)
> clearInterval(COUNTDOWN);
> },1000);
> //-->

Ende des Kommentars natᅵrlich auch entfernen

> </script>

Gruᅵ,
Matthias

Thomas 'PointedEars' Lahn

unread,
Nov 6, 2009, 8:11:57 AM11/6/09
to
Matthias Reuter wrote:

> Stephan schrieb:
>> ich habe hier ein Script das mir die Sekunden zurückzählt, allerdings ist


>> irgendwann die Variable "REST" bei 0, und der Counter bleibt stehen..
>> ;-)
>
> Hier fehlt noch die Information, dass die Anzeige bei "1 Sekunde" stehen

> bleibt. Sonst wäre ja alles wie gewünscht.

ACK

>> Problem ist eigentlich erkannt, nur wie sol ich das Problem beheben?

[Zitat repariert]



> Indem Du
>
> if(REST==0)
> clearInterval(COUNTDOWN);
> },1000);
>
> ersetzt durch
>
> if(REST < 0)
> clearInterval(COUNTDOWN);
> },1000);

(Bitte keine Zitatzeichen für eigenen [neuen] Quelltext verwenden. Das ist
sonst sehr verwirrend!)

Noch einfacher (und vermutlich effizienter): Die Dekrementoperation nach der
Fallunterscheidung ausführen (hier schon richtig™ geschrieben):

if (rest === 0) window.clearInterval(countdown);
rest--;



>> <script language="Javascript">
>
> Ersetze das durch <script type="text/css">

^^^
Das denke ich nicht, Tim ;-)

Korrekt und bisher von allen möglichen MIME-Medientypen am besten
unterstützt ist `text/javascript'.

>> <!--
>
> Lass den Kommentar weg. Er war nötig in Netscape 2, damit Browser, die das


> Script-Tag nicht kennen, das Skript nicht als Text darstellen.

An dieser Stelle war der *Pseudo*-Kommentar noch nie unbedingt nötig.
Ausserdem mag ich bedreifeln, dass Netscape 2 das benötigte, denn JavaScript
1.0 wurde mit Netscape Navigator 2.0 eingeführt. Wir haben das hier
übrigens schon zur Genüge durchgekaut.

>> document.getElementById("COUNTDOWN").innerHTML = COUNTDOWNTEXT_TAG +
>> COUNTDOWNTEXT_STUNDE + COUNTDOWNTEXT_MINUTE + COUNTDOWNTEXT_SEKUNDE;
>

> Wenn das Laden Deiner Seite länger als eine Sekunde von hieran dauert,


> kommt es hier zu einem Fehler, wenn das Element mit der ID COUNTDOWN noch
> nicht existiert.

Das ist so nicht richtig. Aus dem OP geht nicht hervor, wo sich das SCRIPT-
Element befindet. Obige Vorgehensweise führt definitiv zu Problemen, wenn
das SCRIPT-Element sich im HEAD-Element befindet; sie führt nicht definitiv
zu Problemen, ist aber weiterhin fehlerträchtig, wenn sich das SCRIPT-
Element am Ende des BODY-Elements befindet. Daher:

> Eine Lösung wäre, die anonyme Funktion aus dem


> setInterval herauszuholen
>
> var displayRemainingTime = function () {
> // ...
> };
>

> und dann über


>
> <body onload="var COUNTDOWN = window.setInterval(displayRemainingTime,
> 1000);">
>
> zu starten.

ACK

>> [...]
>> //-->
>
> Ende des Kommentars natürlich auch entfernen

s/Kommentars/Pseudo-$&/

Wollen wir nicht doch lieber in *de*.comp.lang.javascript weiterdiskutieren?
Ich setz' mal ein passendes F'up2. Die Newsserver der bisherigen
Diskutanden führen jene Gruppe.


PointedEars
--
Use any version of Microsoft Frontpage to create your site.
(This won't prevent people from viewing your source, but no one
will want to steal it.)
-- from <http://www.vortex-webdesign.com/help/hidesource.htm> (404-comp.)

Thomas 'PointedEars' Lahn

unread,
Nov 6, 2009, 6:39:40 AM11/6/09
to
Stephan wrote:

> ich habe hier ein Script das mir die Sekunden zur�ckz�hlt, allerdings ist
> irgendwann die Variable "REST" bei 0, und der Counter bleibt stehen.. ;-)

Was soll ein Count*down* denn sonst machen?

> Problem ist eigentlich erkannt,

Tatsächlich?

> nur wie sol ich das Problem beheben?

Ich kann kein(e) Problem(e) erkennen, bis auf die folgenden:

> [...]
> <script language="Javascript">

(Schon seit fast 10 Jahren) ungültig, siehe <http://validator.w3.org/>.

> <!--

Veraltet, fehlerträchtig. Weglassen.

> var REST = 100000;
> [...]

Variablenbezeichner sollten nicht vollständig gross geschrieben werden.
Diese Schreibweise wird besser für Bezeichner von Konstanten (const-
Schlüsselwort, JavaScript 1.5+) bzw. nicht zu verändernde Variablen (alle
ECMAScript-Implementationen) reserviert.

> [...]
> var COUNTDOWN = setInterval(function(){

window.setInterval(...)

Ausserdem sollte hier vor dem Aufruf ein Feature-Test stattfinden.

> [...]


> document.getElementById("COUNTDOWN").innerHTML = COUNTDOWNTEXT_TAG +

IDs sind case-sensitive spezifiziert, also besser kleinschreiben, um
Schusselfehler zu vermeiden.

> COUNTDOWNTEXT_STUNDE + COUNTDOWNTEXT_MINUTE + COUNTDOWNTEXT_SEKUNDE;

Die innerHTML-Eigenschaft ist fehlerträchtig und sie zu verwenden hier auch
unnötig (keine HTML-Elemente im Wert). Verwende stattdessen die nodeValue-
Eigenschaft einer TextNode-Instanz, z.B.

var o = document.getElementById("COUNTDOWN");
if (o)
{
o.firstChild.nodeValue = "...";
}

> REST -= 1;

Oder einfach

REST--;

(Siehe jedoch obige Empfehlung zur Schreibweise des Bezeichners.)

> if(REST==0)

if (REST === 0)

ist etwas effizienter und wird heutzutage von allen gängigen
Implementationen unterstützt:

<http://PointedEars.de/es-matrix>

> clearInterval(COUNTDOWN);

window.clearInterval(...);

(Feature-Test ist hier IMHO nicht zwingend, denn man kann davon ausgehen,
dass setInterval() nicht ohne clearInterval() implementiert wird.)

> [...]
> //-->

Veraltet, fehlerträchtig. Weglassen.

> Danke

Gern geschehen. Deine Umlaute sind jedoch nicht deklariert; bitte stell
Deinen Newsclient richtig ein: <http://oe-faq.de/>

Bevor Du antwortest, lies bitte auch
<http://lernst.de/zitieren/kriegst.de/antworten>

Übrigens existiert de.comp.lang.javascript, wo mehr Abonnenten Deutsch
verstehen dürften: <http://dcljs.de/>


PointedEars
--
Prototype.js was written by people who don't know javascript for people
who don't know javascript. People who don't know javascript are not
the best source of advice on designing systems that use javascript.
-- Richard Cornford, cljs, <f806at$ail$1$8300...@news.demon.co.uk>

Stephan

unread,
Nov 6, 2009, 4:49:44 PM11/6/09
to

"Matthias Reuter" <fronte...@web.de> schrieb im Newsbeitrag
news:op.u2y3u...@hp5vj2j.webde.local...

>> Problem ist eigentlich erkannt, nur wie sol ich das Problem beheben?
>
> Indem Du
>
>> if(REST==0)
>> clearInterval(COUNTDOWN);
>> },1000);
>
> ersetzt durch
>
>> if(REST < 0)
>> clearInterval(COUNTDOWN);
>> },1000);
>
>
> Soviel zur Beantwortung Deiner Frage. Jetzt kommen noch ein paar
> Anmerkungen zum Code-Stil:


Besten Dank f�r die Vielen tipps, allerdings bleibt die Sekunde nun bei 0
Stehen, anstelle das er eine Minute abzieht, und die Sekunden wieder bei 59
anf�ngt.
Also scheint das problem noch anderstwo zu stecken.


w�rde mich freuen wenn jemand dem Problem auf die schliche kommen k�nnte.

Lg
Stephan


Dr J R Stockton

unread,
Nov 7, 2009, 12:26:19 PM11/7/09
to
In comp.lang.javascript message <4af3d9d2$1...@news.tiscalinet.ch>, Fri,
6 Nov 2009 09:09:40, Stephan <xla...@vtxmail.ch> posted:

Your question will be, on average, more easily read in
de.comp.lang.javascript; so, while there can be no reasonable objection
to posting here in German, why not cross-post there so that they also
may benefit? Granted, the Swiss are better-mannered.

Ihre Frage wird sein, im Durchschnitt mehr leicht lesbar in
de.comp.lang.javascript, so, und es kann keine vern锟絥ftigen Einw锟絥de
zur Entsendung hier in Deutsch, warum nicht 锟絙er-post es so, dass sie
auch profitieren k锟絥nen? Zugegeben, die Schweizer bessere Manieren.


For efficient countdown code, see
<URL:http://www.merlyn.demon.co.uk/js-date2.htm#ECD>; go via
<URL:http://www.merlyn.demon.co.uk/index.htm> to get it in
"translation".

F锟絩 eine effiziente Countdown-Codes finden Sie unter
<URL:http://www.merlyn.demon.co.uk/js-date2.htm#ECD>, Gehe 锟絙er
<URL:http://www.merlyn.demon.co.uk/index.htm>, Um es in
"锟絙ersetzung".


> if(TAGE > 1 || TAGE == 0)
> {
> COUNTDOWNTEXT_TAG = TAGE + " Tage ";
> }
> else if(Jahre == 1)

********************** warum Jahre ?????????


> {
> COUNTDOWNTEXT_TAG = TAGE + " Tag ";
> }
> }

> COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunden ";
> }
> else if(Jahre == 1)

********************** Jahre ?????????


> {
> COUNTDOWNTEXT_STUNDE = STUNDEN + " Stunde ";
> }
> }

> COUNTDOWNTEXT_MINUTE = MINUTEN + " Minuten ";
> }
> else if(Jahre == 1)

********************** Jahre ?????????

<g> Easier in a language with regular plurals
Einfachere in einer Sprache mit regelm锟斤拷igen Plural </g>


--
(c) John Stockton, nr London, UK. ?@merlyn.demon.co.uk Turnpike v6.05.
Web <URL:http://www.merlyn.demon.co.uk/> - w. FAQish topics, links, acronyms
PAS EXE etc : <URL:http://www.merlyn.demon.co.uk/programs/> - see 00index.htm
Dates - miscdate.htm estrdate.htm js-dates.htm pas-time.htm critdate.htm etc.

0 new messages