Autor Zpráva
mfk89
Profil *
Ahoj, mam tento kod pro timer:

Problem je v tom, ze pokud mam napriklad>
<li><a onClick="createTimer('5');">5 min</a></li>
            <li><a onClick="createTimer('15');">15 min</a></li>

Pri prvim spusteni je vse O.K, pokud bych pak chtel odpocitavat napriklad 15 minut, zacne se cas odpocitavat rychleji nez po sekundach.

Mohl by mi prosim nekdo zkuseny poradit, jak udelat jakysi reset timeru pred kazdym dalsim spustenim?

Dekuji za kazdou radu


function createTimer(time)
{
    
    var minutes = time * 60;
    javascript_countdown.init(minutes, 'timerCanvas');
}

var javascript_countdown = function () {
    var time_left = 10; //number of seconds for countdown
    var output_element_id = 'javascript_countdown_time';
    var keep_counting = 1;
    var no_time_left_message = 'No time left for JavaScript countdown!';
 
    function countdown() {
        if(time_left < 2) {
            keep_counting = 0;
        }
 
        time_left = time_left - 1;
    }
 
    function add_leading_zero(n) {
        if(n.toString().length < 2) {
            return '0' + n;
        } else {
            return n;
        }
    }
 
    function format_output() {
        var hours, minutes, seconds;
        seconds = time_left % 60;
        minutes = Math.floor(time_left / 60) % 60;
        hours = Math.floor(time_left / 3600);
 
        seconds = add_leading_zero( seconds );
        minutes = add_leading_zero( minutes );
        hours = add_leading_zero( hours );
 
        return hours + ':' + minutes + ':' + seconds;
    }
 
    function show_time_left() {
        document.getElementById(output_element_id).innerHTML = format_output();//time_left;
    }
 
    function no_time_left() {
        document.getElementById(output_element_id).innerHTML = no_time_left_message;
        
        alert('dssdsd');
    }
 
    return {
        count: function () {
            countdown();
            show_time_left();
        },
        timer: function () {
            javascript_countdown.count();
 
            if(keep_counting) {
                setTimeout("javascript_countdown.timer();", 1000);
            } else {
                no_time_left();
            }
        },
        
        setTimeLeft: function (t) {
            time_left = t;
            if(keep_counting == 0) {
                javascript_countdown.timer();
            }
        },
        init: function (t, element_id) {
            time_left = t;
            output_element_id = element_id;
            javascript_countdown.timer();
        }
    };
}();
Joker
Profil
mfk89:
Problém je v tom, že při zahájení nového odpočtu před skončením toho předchozího zůstane i původní interval, takže pak odečítají dva (a když se to udělá víckrát, tak tři, čtyři, atd.) intervaly. Šlo by použít clearInterval.

Ale tenhle přístup celkově nebude fungovat přesně, protože časovače JS mají omezenou přesnost (která je navíc v různých prohlížečích různá).
Při odpočtu na 15 minut bych tipnul rozdíl mezi koncem odpočtu a skutečnými 15 minutami řádově tak desítky sekund.
Přesnější řešení by asi bylo při začátku odpočtu si uložit cílový čas a potom vždycky spočítat zbývající počet sekund do cílového času. Což by zároveň skrylo (ale nikoli vyřešilo) ten problém s vícenásobnými odpočty.
mfk89
Profil *
Diky, to radeji zkusim neco jineho, desitky sekund rozdil je uz hodne. A o nejakem presnem skriptu pro odpocet prosim nevis?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: