stoper jQuery, opóźnienie - interval

stoper jQuery, opóźnienie - interval
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 lat
  • Postów:149
0

Witam!
Chciał bym zrobić stoper offline przy użyciu jQuery z dokładnością do milisekund.
i oczywiście, zbyt fajnie by było gdyby było wszystko ok. Pojawia się opóźnienie... dlaczego?

Kopiuj
(function($){
    $.fn.stopWatch = function(settings) {

        var config = {
        'hour': 0,
        'minute': 0,
        'second': 0,
        'mili': 0,
        'setInterval': false
        };
        if(settings)
        {
            $.extend(config,settings);
        }
        return this.each(function()
        {
            var timer = $(
            '<div id="stopwatch-timer">'
            + '<span id="stopwatch-h">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-m">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-s">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-mili">000</span>'
            + '</div>');
            
            var controls = $(
            '<div id="stopwatch-controls">'
            + '<button id="start"><i></i> start</button>'
            + '<button id="stop" ><i></i> stop</button>'
            + '<button id="reset"><i></i> reset</button>'
            + '</div>');
            
            $(this).append(timer, controls);
            
            var stopWatch = function()
            {
                if(config.mili < 999)
                {
                    config.mili++;
                    if(config.mili < 10)
                    {
                        $('#stopwatch-mili').html('00'+config.mili);
                    }
                    else 
                    if(config.mili >= 10 && config.mili<100)
                    {
                        $('#stopwatch-mili').html('0'+config.mili);
                    }
                    else
                    {
                        $('#stopwatch-mili').html(config.mili);
                    }
                }
                else if(config.mili == 999)
                {
                    config.mili = '000';
                    $('#stopwatch-mili').html(config.mili);
                    if(config.second <59)
                    {
                        config.second++;
                        if (config.second < 10) 
                        {
                            $('#stopwatch-s').html('0' + config.second);
                        } 
                        else 
                        {
                            $('#stopwatch-s').html(config.second);
                        }
                    }                
                    else if (config.second == 59) 
                    {
                        config.second = '00';
                        $('#stopwatch-s').html(config.second);
                        if (config.minute < 59) 
                        {
                            config.minute++;
                            if (config.minute < 10) 
                            {
                                $('#stopwatch-m').html('0' + config.minute);
                            } 
                            else 
                            {
                                $('#stopwatch-m').html(config.minute);
                            }
                        }
                        else if (config.minute == 59) 
                        {
                            config.minute = "00";
                            $('#stopwatch-m').html(config.minute);
                            if (config.hour < 24) 
                            {
                                config.hour++;
                                if (config.hour < 10) 
                                {
                                    $('#stopwatch-h').html('0' + config.hour);
                                } 
                                else 
                                {
                                    $('#stopwatch-h').html(config.hour);
                                }
                            }
                            else if (config.hour == 24) 
                            {
                                config.hour = "00";
                                $('#stopwatch-h').html(config.hour);
                            }
                        }
                    }
                }
        }//end stopwatch
$('#start').bind(
    {
    click: function() 
        {
        config.setInterval = self.setInterval
        (
            function(){stopWatch()},1
        );
    $('#start').attr("disabled","disabled");
}
});
// click on stop
$('#stop').bind({
    click: function() {
        config.setInterval = window.clearInterval(config.setInterval);
        $('#start').removeAttr("disabled");
    }
});
// click on reset
$('#reset').bind({
    click: function() {
        config.hour = 0;
        $('#stopwatch-h').html('00');
        config.minute = 0;
        $('#stopwatch-m').html('00');
        config.second = 0;
        $('#stopwatch-s').html('00');
        config.mili = 0;
        $('#stopwatch-mili').html('000');
    }
});
});
};
})(jQuery);

Z góry dziękuje za pomoc i rady.
Pozdrawiam.

Mossar
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 10 lat
  • Postów:74
1

Jak tak spojrzałem to przypomniał mi się jeden post od Ferrante o jQuery. Że często lepiej skorzystać z czystego JSa niż ułatwiać sobie jQuery (co sam robie ciągle xd), bo jQuery nie zawsze ma genialnie rozwiązane te funkcje. No i wpisałem z ciekawości jaka jest różnica między setInterval z jQuery i setTimeout z JS. Odpowiedź masz tutaj: http://stackoverflow.com/questions/729921/settimeout-or-setinterval

Spróbuj zrobić to samo z setTimeoutem. Bardzo możliwe, że wtedy będzie chodzić w porządku. Różnica jest subtelna, ale w tym przypadku ważna. Bo to, że tam element się pojawia po sekundzie z odsetkami można pominąć. Ale timer musi być dokładny.


edytowany 2x, ostatnio: Mossar
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 lat
  • Postów:149
0

Właściwie, to znalazłem własnie podobną odpowiedź... A chciałem użyć jquery jako, że już i tak miałem go zaimplementowanego... zły pomysł jak widać. Teraz przerabiam lekko skrypt na pobieranie czasu .now i odejmowaniu od pobranego przy kliknięciu stop, a wyświetlenie będzie szło swoim rytmem... napisze jak skończę;) chyba, ze uważacie, ze to zły pomysł?

Mossar
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 10 lat
  • Postów:74
1

Wiesz co, ostatecznie poda Ci dobry wynik, ale bardzo profesjonalnie to nie będzie działać. Potem w zależnosci od tego jak burzliwie będzie skrypt działał na czyimś komputerze, będzie tą różnicę bardziej lub mniej widać. No ale na pewno jest to jakis półśrodek. Ja np. robiłem na uczelnie układ cyfrowy, timer do mierzenia czasu ułożenia Kostki Rubika. I z funkcją delay (tak na początku kombinowałem) wychodziły mi czasy po 7 sekund regularnie :P A to w moim przypadku tak na serio się zdarzyło może raz w życiu. Także lepiej jednak wymyślać takie algorytmy, które są niezależne od wydajności komputera tak samo zgodne z rzeczywistym upływem czasu.


edytowany 1x, ostatnio: Mossar
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 lat
  • Postów:149
0

No właśnie o tym mówię:

  1. pobieram czas.start przy kliknięciu start
  2. funkcja z interval np 10 pobiera czas.teraz i odejmuje od czas.start
  3. wynik wyświetla co te 10+(czas an wykonanie funkcji) ale będzie to stała różnica.
    Hm? Będzie chyba lepiej ;)
Mossar
Wygląda w porządku ;)
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
  • Postów:2514
1

Po pierwsze:
http://stackoverflow.com/questions/1127905/how-can-i-format-an-integer-to-a-specific-length-in-javascript

Po drugie:
setInterval i setTimeout są z założenia niedokładne. setInterval używasz do wyświetlania czasu stopera co około 50-100milisekund, a samo mierzenie wykonuj używając:
var start = Date.now();
var aktualnyczas = Date.now() - start; // czas w milisekundach

var milisekundy = aktualnyczas; // wyswietlasz: (milisekundy % 1000)
var sekundy = milisekundy / 1000; // wyswietlasz: (sekundy % 60)
var minuty = sekundy / 60; // wyswietlasz: (minuty % 60)
var godziny = minuty / 60; // wyswietlasz: godziny (chyba, ze chcesz doby dodac to % 24)


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 lat
  • Postów:149
0

I tak też zrobiłem:)

Kopiuj
(function($){
    $.fn.stopWatch2 = function(settings) 
    {
        var data = new Date();
        var config =
        {
            'date':0,
            'year': 0,
            'month': 0,
            'day': 0,
            'hour': 0,
            'minute': 0,
            'second': 0,
            'mili': 0,
            'setInterval': false
        };
        var czas_startu = 
        {
            'date':0,
            'year': 0,
            'month':0,
            'day': 0,
            'hour': 0,
            'minute': 0,
            'second': 0,
            'mili': 0,  
        }
        if(settings)
        {
            $.extend(config,settings);
        }
        return this.each(function()
        {
            
            var timer = $(
            '<div id="stopwatch-timer">'
            + '<span id="stopwatch-h">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-m">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-s">00</span>'
            + '<span>:</span>'
            + '<span id="stopwatch-mili">000</span>'
            + '</div>');
            
            var controls = $(
            '<div id="stopwatch-controls">'
            + '<button id="start"><i></i> start</button>'
            + '</div>');
            
            $(this).append(timer, controls);

            var porownanie = function()
            {
                var data = new Date(config.date - czas_startu.date);
                var mili = data.getMilliseconds();
                var sec = data.getSeconds();
                var min = data.getMinutes();
                var h = data.getHours()-1;
                var d = data.getDay()-4;
                var m = data.getMonth();
                var y = data.getYear()-70;
                //$('#stopwatch-mil').html('0' + config.second);
                //console.log(y+' '+m+' '+d+' '+h+' '+min+' '+sec+' '+mili);
                if(mili<10)
                $('#stopwatch-mili').html('00'+mili);
                else if(mili>=10 && mili<100)
                $('#stopwatch-mili').html('0'+mili);
                else 
                $('#stopwatch-mili').html(mili);
                
                if(sec<10)
                $('#stopwatch-s').html('0'+sec);
                else
                $('#stopwatch-s').html(sec);
                
                if(min<10)
                $('#stopwatch-m').html('0'+min);
                else
                $('#stopwatch-m').html(min);
                
                if(h<10)
                $('#stopwatch-h').html('0'+h);
                else
                $('#stopwatch-h').html(h); 
                
            }
            var czas_ustaw = function()
            {
                var data = new Date();
                config.date = data;
                config.year = data.getFullYear();
                config.month = data.getMonth();
                config.day = data.getDate();
                config.hour = data.getHours();
                config.minute = data.getMinutes();
                config.second = data.getSeconds();
                config.mili = data.getMilliseconds();   
            }
            var stopWatch2 = function()
            {
                czas_ustaw();
                porownanie();
            }//end stopwatch
            
$('#start').bind
(
    {
    click: function() 
        {
            //var teraz = new Date();
            var data = new Date();
            czas_startu.date = data;
            czas_startu.year = data.getFullYear();
            czas_startu.month = data.getMonth();
            czas_startu.day = data.getDate();
            czas_startu.hour = data.getHours();
            czas_startu.minute = data.getMinutes();
            czas_startu.second = data.getSeconds();
            czas_startu.mili = data.getMilliseconds();            
            config.setInterval = self.setInterval
            (
                function(){stopWatch2()},50
            );

            jQuery(this).removeAttr("id").attr("id","stop");
        }
    }
);
// click on stop

});
};
})(jQuery);

Jak zwykle pomocni - rozdaje plusiki i pozdrawiam ;)

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Rzeszów
0

ode mnie info - pamiętaj, że funkcje czasowe w javascript mogą mieć ustawiony minimalny czas przez przeglądarki. tj. np. na windowsie masz nawet w ustawieniach zasilania minimalny interwał w przypadku gdy laptop pracuje na zasilaniu bateryjnym - mniejszy interwał spowoduje że i tak będzie użyty ten minimalny. chrome robi podobnie w przypadku zakładek które są nieużywane - im dłużej nie używasz karty - tym wydłuża się minimum. tak na przyszłość pamiętaj, a gdy będzie to krytyczne to poszukaj informacji o tym (ja też mam informacje tylko "po łebkach", którymi się dzielę)


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)