• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

jak resetować timer js za każdym razem gdy odświeżam stronę

Cloud VPS
+1 głos
692 wizyt
pytanie zadane 6 kwietnia 2024 w JavaScript przez sensor Użytkownik (680 p.)
edycja 6 kwietnia 2024 przez sensor
<div id="timer"></div>
const Interval = setInterval(setTimer, 1000);
function setTimer() 
{
	const d = new Date();
	const seconds = d.getMinutes() * 60 + d.getSeconds();
	const fseconds = 480;
	const timeleft = fseconds - (seconds % fseconds);
	const result = parseInt(timeleft / 60) + ":" + (timeleft % 60);
	if(timeleft==1)
	{
		window.location = "";
	}
	document.getElementById("timer").innerHTML = result;
	//console.log(seconds);
};
komentarz 6 kwietnia 2024 przez overcq Pasjonat (22,630 p.)
edycja 6 kwietnia 2024 przez overcq
Ten kod, z tego co widzę, przypisze “location” na sekundę przed 5 minutami po pełnej godzinie.

Czy mógłbyś dokładniej sformułować pytanie?
komentarz 6 kwietnia 2024 przez sensor Użytkownik (680 p.)
chcę żeby za każdym razem gdy strona się odświeży, przeładuje, resetował się timer, a coś nie robi, próbowałem umieszczać w skrypcie clearInterval ale nie działa, chyba że źle go umieszczam
1
komentarz 6 kwietnia 2024 przez overcq Pasjonat (22,630 p.)

Chyba źle rozumiesz, co zwraca “Date()”. To wraca z aktualną datą: MSN Date.

Jeśli chcesz mieć licznik, to albo potrzebujesz sobie zapisać datę przy załadowaniu strony i następnie ją co sekundę odejmować od aktualnej, albo zwiększać licznik co sekundę, bazując na tym, że jest uruchamiany właśnie w takim odstępie czasu.

2 odpowiedzi

+1 głos
odpowiedź 6 kwietnia 2024 przez pablop76 VIP (123,580 p.)

Odpal skrypt po załadowaniu strony, ale i tak nie zapisujesz stanu timera, więc za każdym razem startuje od nowa.
 

+1 głos
odpowiedź 6 kwietnia 2024 przez VBService Ekspert (256,600 p.)

Przy odliczaniu w "dół" (count down), niekoniecznie musisz używać obiektu Date, możesz np. tak licznik zapisać

<div id="timer"></div>

<script>
  const MINUTES = 5; // minuty do odliczenia 5 ... 1, .5 30s, .25 15s itd.
  setTimeout(countDownTimer, 0, (MINUTES * 60));

  function countDownTimer(seconds) {
    //console.clear();
    //console.log(seconds);

    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = (seconds % 60).toString().padStart(2, '0');  
    document.getElementById('timer').textContent = `${minutes}:${remainingSeconds}`;

    if (seconds < 1) {
      window.location = '';
    }
    setTimeout(countDownTimer, 1000, --seconds);
  }
</script>

 

komentarz 6 kwietnia 2024 przez sensor Użytkownik (680 p.)

świetne właśnie o to mi chodziło, dzięki wielkie

<div id="timer"></div>
 
<script>
  setTimeout(countDownTimer, 0, (480));
 
  function countDownTimer(seconds) {
    //console.clear();
    //console.log(seconds);
 
    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = (seconds % 60).toString().padStart(2, '0');  
    document.getElementById('timer').textContent = `${minutes}:${remainingSeconds}`;
 
    if (seconds < 1) {
      window.location = '';
    }
    setTimeout(countDownTimer, 1000, --seconds);
  }
</script>

 

komentarz 6 kwietnia 2024 przez overcq Pasjonat (22,630 p.)

@VBSe­r­vi­ce, tak zrobiony licznik może trochę opóźniać.

komentarz 6 kwietnia 2024 przez VBService Ekspert (256,600 p.)

To też zależy jakiego rzędu dokładność potrzebuje @dido.

1
komentarz 6 kwietnia 2024 przez VBService Ekspert (256,600 p.)
edycja 6 kwietnia 2024 przez VBService

Można się pokusić o użycie

Performance.now()

 

The performance.now() method returns a high resolution timestamp in milliseconds.

i np. requestAnimationFrame

<div id="timer"></div>

<script>
  const MINUTES = 5; // minuty do odliczenia
  // Pobierz aktualny czas
  const startTime = performance.now();  
  // Rozpocznij odliczanie
  requestAnimationFrame(updateTimer);

  function updateTimer() {
    // Oblicz czas, który upłynął od rozpoczęcia odliczania
    const currentTime = performance.now();
    const elapsedTimeInSeconds = (currentTime - startTime) / 1000;

    // Oblicz pozostały czas
    const remainingSeconds = MINUTES * 60 - elapsedTimeInSeconds;
    const minutes = Math.floor(remainingSeconds / 60);
    const seconds = Math.floor(remainingSeconds % 60);
    
    if (remainingSeconds > 0) { // Sprawdź, czy odliczanie powinno być kontynuowane
      document.getElementById('timer').textContent = `${minutes}:${String(seconds).padStart(2, '0')}`;
      requestAnimationFrame(updateTimer); // Kontynuuj odświeżanie interfejsu
    } else {
      window.location = ''; // Przekieruj po zakończeniu odliczania
    }
  }
</script>

 

komentarz 6 kwietnia 2024 przez sensor Użytkownik (680 p.)
jak najbardziej jest wystarczająca ta dokładność
1
komentarz 6 kwietnia 2024 przez overcq Pasjonat (22,630 p.)
<div id="timer_1"></div>
<div id="timer_2"></div>
document.addEventListener( "DOMContentLoaded", () =>
  {   const minutes = 5;
      const e_1 = document.getElementById( "timer_1" );
      const e_2 = document.getElementById( "timer_2" );
      let e_2_seconds = minutes * 60;
      function e_1_function( seconds
      ){  const remaining_minutes = Math.floor( seconds / 60 );
          const remaining_seconds = ( seconds % 60 ).toString().padStart( 2, '0' );
          e_1.textContent = `${remaining_minutes}:${remaining_seconds}`;
          if( --seconds )
              setTimeout( e_1_function, 1000, seconds );
          else
              ;//location = "";
      }
      function e_2_function(
      ){  const remaining_minutes = Math.floor( e_2_seconds / 60 );
          const remaining_seconds = ( e_2_seconds % 60 ).toString().padStart( 2, '0' );
          e_2.textContent = `${remaining_minutes}:${remaining_seconds}`;
          if( !--e_2_seconds )
          {   clearInterval( e_2_interval );
              //location = "";
          }
      }
      const e_2_interval = setInterval( e_2_function, 1000 );
      e_1_function( minutes * 60 );
      e_2_function();
  }
);

Po uruchomieniu tego porównania wystarczy wcisnąć na przykład “Ctrl + PageUp”, by przełączać karty przeglądarki wstecz, i od razu widać różnicę. A “requestAnimationFrame” jest podobno zatrzymywane, gdy karta nie jest na wierzchu, chociaż tutaj to może być zamierzony efekt.

komentarz 6 kwietnia 2024 przez VBService Ekspert (256,600 p.)

Jak to w programowaniu bywa, wszystko zależy od kontekstu i od wymaganej jak w tym przypadku dokładności. smiley 

komentarz 6 kwietnia 2024 przez VBService Ekspert (256,600 p.)

A “requestAnimationFrame” jest podobno zatrzymywane, gdy karta nie jest na wierzchu

w przypadku przeglądarki, której na co dzień używam, Brave, nawet gdy karta jest nieaktywna requestAnimationFrame nie jest zatrzymywane.

Podobne pytania

0 głosów
0 odpowiedzi 301 wizyt
pytanie zadane 16 grudnia 2022 w JavaScript przez PtaQ Początkujący (280 p.)
0 głosów
2 odpowiedzi 311 wizyt
0 głosów
0 odpowiedzi 156 wizyt
pytanie zadane 11 sierpnia 2020 w JavaScript przez Patryk L Bywalec (2,000 p.)

93,469 zapytań

142,404 odpowiedzi

322,716 komentarzy

62,852 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...