Więcej
Jak ustawić opóźnienie czasowe w javascript
Mam ten kawałek js w mojej witrynie, aby przełączać obrazy, ale potrzebuję opóźnienia, gdy klikniesz obraz po raz drugi. Opóźnienie powinno wynosić 1000ms. Więc kliknąłbyś img.jpg wtedy pojawiłby się img_onclick.jpg. Następnie klikamy na obrazek img_onclick.jpg, po czym pojawia się img.jpg z opóźnieniem 1000ms.
Oto kod:
jQuery(document).ready(function($) {
$(".toggle-container").hide();
$(".trigger").toggle(function () {
$(this).addClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img_onclick.jpg');
}, function () {
$(this).removeClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img.jpg');
});
$(".trigger").click(function () {
$(this).next(".toggle-container").slideToggle();
});
});
143
3
Użyj
setTimeout()
:Jeśli chcesz to zrobić bez
setTimeout
: Odnieś się do tego pytania.Umieść swój kod wewnątrz
{ }
.500
= 0,5 sekundy2200
= 2.2 sekundyitd.
Istnieją dwa (najczęściej używane) typy funkcji timera w javascript
setTimeout
isetInterval
(other)Obie te metody mają ten sam podpis. Przyjmują one funkcję wywołania zwrotnego i czas opóźnienia jako parametr.
setTimeout
wykonuje się tylko raz po opóźnieniu, podczas gdysetInterval
kontynuuje wywoływanie funkcji zwrotnej po każdym milisekundowym opóźnieniu.Obie te metody zwracają identyfikator liczby całkowitej, który może być użyty do wyczyszczenia ich przed wygaśnięciem timera.
Obie te metody pobierają identyfikator liczby całkowitej zwrócony z powyższych funkcji
setTimeout
isetInterval
.Przykład:
setTimeout.
Jeśli uruchomisz powyższy kod, zobaczysz, że alarmuje on
przed setTimeout
, a następniepo setTimeout
i w końcu alarmujeJestem setTimeout
po 1sec (1000ms).To co możesz zauważyć w przykładzie to to, że
setTimeout(...)
jest asynchroniczny, co oznacza, że nie czeka na upłynięcie czasu przed przejściem do następnej instrukcji tj.Przykład:
setInterval
Jeśli uruchomisz powyższy kod zobaczysz, że alarmuje on
przed setInterval
a następniepo setInterval
w końcu alarmujeI am setInterval
5 razy po 1sec (1000ms) ponieważ setTimeout czyści timer po 5 sekundach lub co 1 sekundę dostaniesz alertI am setInterval
w nieskończoność.**Jak przeglądarka wewnętrznie to robi?
Wyjaśnię to w skrócie.
Aby to zrozumieć musisz wiedzieć o kolejce zdarzeń w javascript. W przeglądarce jest zaimplementowana kolejka zdarzeń. Kiedykolwiek zdarzenie zostanie wywołane w js, wszystkie te zdarzenia (takie jak kliknięcie itp.) są dodawane do tej kolejki. Kiedy przeglądarka nie ma nic do wykonania, pobiera zdarzenie z kolejki i wykonuje je jedno po drugim.
Teraz, kiedy wywołasz
setTimeout
lubsetInterval
, twoje wywołanie zwrotne zostanie zarejestrowane do timera w przeglądarce i zostanie dodane do kolejki zdarzeń po upływie podanego czasu i ostatecznie javascript pobierze zdarzenie z kolejki i wykona je.Dzieje się tak, ponieważ silnik javascript są jednowątkowe i mogą wykonywać tylko jedną rzecz w tym samym czasie. Tak więc, nie mogą one wykonywać innych javascript i śledzić swój timer. Dlatego te timery są zarejestrowane w przeglądarce (przeglądarka nie jest jednowątkowa) i może śledzić timer i dodać zdarzenie do kolejki po wygaśnięciu timera.
To samo dzieje się dla
setInterval
tylko w tym przypadku zdarzenie jest dodawane do kolejki ponownie i ponownie po określonym odstępie czasu, aż zostanie wyczyszczone lub strona przeglądarki zostanie odświeżona.Stąd, twój callback może czasami zająć więcej niż określony czas opóźnienia, aby zostać wywołany specjalnie, gdy inny kod blokuje wątek i nie dając mu czas na przetwarzanie tego, co'jest tam w kolejce.
I jak już wspomniałem javascript jest pojedynczym wątkiem. Tak więc, jeśli blokujesz wątek na długo.
Na przykład ten kod
Twój użytkownik może otrzymać komunikat o treści strona nie odpowiada.