Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Odliczanie czasu
zegarek84
post 9.06.2013, 01:09:38
Post #21





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


Cytat(mccc @ 9.06.2013, 00:48:05 ) *
Idealnie nie jest, bo jak sie pokazuja zera to troche dziwnie, a po odswiezeniu pokazuje date i godzine, ale mimo wszystko w koncu dziala mniej wiecej tak jak chcialem.

W tamtej funkcji co ją zmodyfikowałeś jako parametr masz przekazywany "id" licznika, więc przy tym if'ie co go zmieniłeś przed zakończeniem funkcji możesz na tym elemencie zrobić co chcesz np. go ukryć... elementy masz zapisane w jakiejś globalnej tablicy to referencję do niego możesz pobrać przez CD_OBJS[id] co będzie szybsze od document.getElementById(id)...

swoją drogą skoro ten ktoś pisał w JS co najmniej 3 lata to dziwne, iż korzystał z eval'a w setTimeout...

tak na prawdę rozwiązanie które Ci podali na szybko zatrzymuje licznik ale tylko wizualnie, gdyż obliczanie co 1s wciąż jest...
można by to naprawić np. przez globalną tablicę przechowującą wskaźnik do setTimeout na aktualnym obiekcie po czym clearTimeout na tablica[id]

format wyświetlanego tekstu ustalasz w linijce 39...

edit
na szybko bo nie wiem co chcesz osiągnąć - nie chce mi się wszystkiego czytać... to jak mają zostać same zera to po prostu zamiast return tam gdzie napisali to warunek
if (ms <= 0) ms = 0;

ale jak wspomniałem tak na prawdę licznik nie staje w miejscu...

Ten post edytował zegarek84 9.06.2013, 01:13:53


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
mccc
post 9.06.2013, 02:06:20
Post #22





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 8.06.2013

Ostrzeżenie: (0%)
-----


Dobra udalo mi sie to zrobic tak, ze zaczyna liczyc do kolejnego dnia wiec jest ok(przy okazji odpadl nam problem tego, ze odliczanie sie zatrzymuje tylko wizualnie, bo od razu odlicza do nastepnego dnia).
W sumie moglo by tak zostac ale moze jeszcze cos da rade pokombinowac?
W momencie kiedy jest zero zeby sie pokazywal tekst "event w trakcie" przez np 5 minut, a potem zeby dalej odliczalo do kolejnego dnia?
Da rade to zrobic w jakis prosty sposob czy nie? Jesli nie to sie nie bawimy. Jesli tak to prosze o rozwiazanie.
Go to the top of the page
+Quote Post
zegarek84
post 9.06.2013, 10:59:41
Post #23





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


to zależy jak masz teraz zrobione lub jak zamierzasz mieć to zrobione... w skrypcie który podałeś w linii 37 masz napisane i z tego mógłbyś skorzystać
Cytat
// If you want to manually customise the counter display, then edit this line:

no i w tamtym poniższym if'ie masz wyświetlanie odliczania, tu możesz sprawdzić warunki i wyświetlić albo czas albo inny napis (do elementu masz wstawiane przez innerHTML) - oczywiście jak wnioskuję skoro odliczanie masz nie zatrzymywane modyfikując tylko wyświetlanie choć byłby ten sam napis to odliczanie dalej by trwało... ja bym zatrzymał odliczanie, ustawił tekst i wznowił odliczanie po tych 5 minutach korzystając z setTimeout... ale na Twoje potrzeby wystarczy modyfikacja widoku i jakiś if w wyświetlaniu...

ps. tego eval'a w setTimeout możesz zastąpić na kilka lepszych sposobów zamiast
Kod
setTimeout("if(typeof CD_T=='function'){CD_T('" + id + "'," + e + ")}", 1100-n.getMilliseconds());

tu jest też sprawdzanie, czy funkcja nie została nadpisana - no tak bywa jak się korzysta z globali i ma się wiele skryptów ;p - ale to bez sensu skoro do konfliktu nie powinniśmy dążyć...
Kod
setTimeout(function(){CD_T(id, e);}, 1100-n.getMilliseconds());

jeśli w innych skryptach zmienne po drodze mogą być zmodyfikowane a nie powinny to możesz przekazać parametry do funkcji w stylu:
Kod
setTimeout((function(id, e){ return function(){CD_T(id, e);};})(id, e), 1100-n.getMilliseconds());


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
mccc
post 9.06.2013, 12:13:11
Post #24





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 8.06.2013

Ostrzeżenie: (0%)
-----


Cytat(zegarek84 @ 9.06.2013, 11:59:41 ) *
to zależy jak masz teraz zrobione lub jak zamierzasz mieć to zrobione... w skrypcie który podałeś w linii 37 masz napisane i z tego mógłbyś skorzystać

no i w tamtym poniższym if'ie masz wyświetlanie odliczania, tu możesz sprawdzić warunki i wyświetlić albo czas albo inny napis (do elementu masz wstawiane przez innerHTML) - oczywiście jak wnioskuję skoro odliczanie masz nie zatrzymywane modyfikując tylko wyświetlanie choć byłby ten sam napis to odliczanie dalej by trwało... ja bym zatrzymał odliczanie, ustawił tekst i wznowił odliczanie po tych 5 minutach korzystając z setTimeout... ale na Twoje potrzeby wystarczy modyfikacja widoku i jakiś if w wyświetlaniu...

ps. tego eval'a w setTimeout możesz zastąpić na kilka lepszych sposobów zamiast
Kod
setTimeout("if(typeof CD_T=='function'){CD_T('" + id + "'," + e + ")}", 1100-n.getMilliseconds());

tu jest też sprawdzanie, czy funkcja nie została nadpisana - no tak bywa jak się korzysta z globali i ma się wiele skryptów ;p - ale to bez sensu skoro do konfliktu nie powinniśmy dążyć...
Kod
setTimeout(function(){CD_T(id, e);}, 1100-n.getMilliseconds());

jeśli w innych skryptach zmienne po drodze mogą być zmodyfikowane a nie powinny to możesz przekazać parametry do funkcji w stylu:
Kod
setTimeout((function(id, e){ return function(){CD_T(id, e);};})(id, e), 1100-n.getMilliseconds());

To co podales to w ogole nie wiem co jest, a co nie wkleilem to dziala tak samo tongue.gif

Wykminilem cos takiego przy wyswietlaniu:
  1. if (CD_OBJS[id]) {
  2. var da = new Date();
  3. var na = da.getHours();
  4. var godziny = [12, 17, 18, 19]
  5.  
  6. if (na > godziny[id]){
  7. CD_OBJS[id].innerHTML ="Event Zakonczony";
  8. }
  9. else
  10. {
  11. CD_OBJS[id].innerHTML =CD_ZP(h) + " godz " + CD_ZP(m) + " min ";
  12. }
  13. }

Jak zamiast godziny[id] wpisze np 16 to wszystko dziala. Ale jak proboje pobrac z tablicy dla kazdego eventu inna godzine to juz nie dziala i caly czas odlicza.
Co zle zrobilem? Nie bede kopiowac 4 razy calego wyswietlania i zamiast uzywac zmiennej id podawac id przy kazdym warunku... A na tablicy nie chce pojsc :/
Jak by to zadzialalo to bym dodal jeszcze sprawdzanie minut i zeby przez kilka minut sie pokazywalo, event w trakcie, potem by moglo odliczac dalej jak chce. Tylko... cos z ta tablica jest nie tak.

Ten post edytował mccc 9.06.2013, 12:16:12
Go to the top of the page
+Quote Post
zegarek84
post 9.06.2013, 14:53:43
Post #25





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


źle z tablicami... a Tobie raczej chodziło o tablicę asocjacyjną czyli zwykły obiekt literalny czy jak go tam w JS zwą... ale bez sensu zapisywać to w tablicy skoro do funkcji "CD_D(n, id, e)" masz przekazywaną liczbę milisekund w zmiennej e czasu do którego odliczasz... więc jeśli chcesz wyciągnąć z tego przy porównywaniach minuty, godziny itd to wystarczy jak zrobisz coś w stylu
Kod
var oEventData = new Date(e); // i tu masz wszystkie info ze sparsowanego tekstu z html'a...


ale mało tego, bo Tobie chodzi o prosty warunek w skrócie który oEventDate <= new Date() gdzie jeszcze 5 minut w milisekundach to 5 * 60s * 1000ms...

... wróć... byś lepiej mógł co kolwiek zrozumieć pobaw się konsolą w przeglądarce, do firefox'a możesz doinstalować sobie firebug'a, w google chrome crlt+shift+i i zakładka konsola... obiekt data możesz zamienić na milisekundy np. przez +oEventDate, ale nie do stringu - to taki skrócony zapis... a teraz wróćmy do myśli...

Ciebie interesuje warunek (nierówność na obiektach w google chrome w konsoli też działa ale dla łatwiejszego zrozumienia operujemy na liczbach nie na obiektach)
Kod
var oData = new Date();
if(
  (+oEventData < +oData)
  && ( (+oData  - +oEventData) <= (5 * 60 * 1000) )
) { // warunek spełniony

}


i popracuj nad czytelnością kodu bo się pogubisz... to coś napisał można czytelniej w stylu
Kod
var sZegar;
if(spelniony) {
  sZegar = "Event Zakonczony";
} else {
  sZegar = CD_ZP(h) + " godz " + CD_ZP(m) + " min ";
}
CD_OBJS[id].innerHTML = sZegar;


Ten post edytował zegarek84 9.06.2013, 14:56:01


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
mccc
post 9.06.2013, 20:25:44
Post #26





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 8.06.2013

Ostrzeżenie: (0%)
-----


Ok jest swietnie. Liczy ladnie. Jak odliczy pisze, ze event trwa. Jak minie kilka minut to znow liczy do nastepnego dnia. Lepiej byc nie moglo praktycznie.
Dzieki za pomoc wszystkim wink.gif
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 22:43