Mam ten kawałek js w mojej witrynie, aby przełączać obrazy, ale potrzebuję opóźnienia po kliknięciu obrazu po raz drugi. Opóźnienie powinno wynosić 1000 ms. Więc należy kliknąć img.jpg, a następnie pojawi się img_onclick.jpg. Następnie kliknij obraz img_onclick.jpg. Następnie powinno nastąpić opóźnienie 1000 ms, zanim img.jpg zostanie ponownie wyświetlony.
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();
});
});
javascript
jquery
Niebiesko-pomarańczowy
źródło
źródło
setTimeout(function(){/*YourCode*/},1000);
.stop()
chociaż. Zajrzyj tutaj api.jquery.com/stopOdpowiedzi:
Zastosowanie
setTimeout()
:Jeśli chcesz to zrobić bez
setTimeout
: Odnieś się do tego pytania .źródło
Umieść swój kod wewnątrz
{ }
500
= 0,5 sekundy2200
= 2,2 sekundyitp.
źródło
Rozwiązanie ES-6
Poniżej znajduje się przykładowy kod, który używa aync / await, aby mieć rzeczywiste opóźnienie.
Istnieje wiele ograniczeń i może to nie być przydatne, ale po prostu publikuj tutaj dla zabawy.
źródło
delay
funkcji, aby być asynchroniczny. To niesamowite opóźnienie działa, gdy w treści funkcji asynchronicznej oczekuje się Obietnicy zwracanej przez zwykłą funkcję.Istnieją dwa (najczęściej używane) typy funkcji timera w javascript
setTimeout
isetInterval
( inne )Obie te metody mają ten sam podpis. Jako parametr przyjmują funkcję oddzwaniania i czas opóźnienia.
setTimeout
wykonuje tylko raz po opóźnieniu, podczas gdysetInterval
wywołuje funkcję zwrotną po każdych milisekach opóźnienia.obie te metody zwracają identyfikator w postaci liczby całkowitej, którego można użyć do wyczyszczenia ich przed upływem czasu.
clearTimeout
iclearInterval
obie te metody pobierają identyfikator całkowity zwrócony z powyższych funkcjisetTimeout
isetInterval
Przykład:
setTimeout
Jeśli uruchomisz powyższy kod, zobaczysz, że ostrzega,
before setTimeout
a następnieafter setTimeout
ostrzegaI am setTimeout
po 1 sek. (1000 ms)Z przykładu można zauważyć, że
setTimeout(...)
jest asynchroniczny, co oznacza, że nie czeka na upłynięcie licznika czasu przed przejściem do następnej instrukcji, tj.alert("after setTimeout");
Przykład:
setInterval
Jeśli uruchomisz powyższy kod, zobaczysz, że ostrzega,
before setInterval
a następnieafter setInterval
ostrzegaI am setInterval
5 razy po 1 sek. (1000 ms), ponieważ setTimeout czyści licznik czasu po 5 sekundach lub co 1 sekundę otrzymasz alertI am setInterval
Nieskończenie.Jak przeglądarka to robi wewnętrznie?
Krótko wyjaśnię.
Aby zrozumieć, że musisz wiedzieć o kolejce zdarzeń w javascript. W przeglądarce zaimplementowano kolejkę zdarzeń. Za każdym razem, gdy zdarzenie zostanie wyzwolone w js, wszystkie te zdarzenia (takie jak kliknięcie itp.) Są dodawane do tej kolejki. Kiedy Twoja przeglądarka nie ma nic do wykonania, pobiera zdarzenie z kolejki i wykonuje je jedno po drugim.
Teraz, gdy zadzwonisz
setTimeout
lubsetInterval
twój callback zostanie zarejestrowany do licznika czasu w przeglądarce, zostanie on dodany do kolejki zdarzeń po upływie określonego czasu i ostatecznie javascript pobierze zdarzenie z kolejki i wykonuje je.Dzieje się tak, ponieważ silnik javascript jest jednowątkowy i może wykonywać tylko jedną rzecz naraz. Dlatego nie mogą wykonywać innych skryptów javascript i śledzić Twojego timera. Dlatego te timery są rejestrowane w przeglądarce (przeglądarka nie jest jednowątkowa) i może śledzić licznik czasu i dodawać zdarzenie do kolejki po jego wygaśnięciu.
to samo dzieje się
setInterval
tylko w tym przypadku, gdy zdarzenie jest ponownie dodawane do kolejki po określonym czasie, aż zostanie wyczyszczone lub odświeżona strona przeglądarki.W związku z tym wywołanie zwrotnego wywołania zwrotnego może czasami zająć więcej niż określony czas opóźnienia, aby zostać wywołanym specjalnie, gdy inny kod blokuje wątek i nie daje czasu na przetworzenie tego, co jest w kolejce.
A jak wspomniałem, javascript to pojedynczy wątek. Tak więc, jeśli długo blokujesz wątek.
Jak ten kod
Twój użytkownik może otrzymać komunikat informujący, że strona nie odpowiada .
źródło
setTimeout
jeśli nie chcesz zachowania asynchronicznego.W przypadku połączeń synchronizacyjnych możesz użyć poniższej metody:
źródło
Jeśli potrzebujesz odświeżenia, jest to kolejna możliwość:
źródło
Oto, co robię, aby rozwiązać ten problem. Zgadzam się, że jest to spowodowane problemem z synchronizacją i potrzebowałem przerwy, aby wykonać kod.
Ten nowy kod wstrzyma go na 1 sekundę, a tymczasem uruchomi Twój kod.
źródło
Przekażę swój wkład, ponieważ pomaga mi to zrozumieć, co robię.
Aby zrobić pokaz slajdów z automatycznym przewijaniem, który ma 3 sekundy oczekiwania, wykonałem następujące czynności:
Pamiętaj, że podczas wykonywania setTimeout () w ten sposób; wykona wszystkie funkcje przekroczenia limitu czasu tak, jakby były wykonywane w tym samym czasie, przy założeniu, że w ustawieniu setTimeout (nextImage, delayTime); czas opóźnienia to statyczne 3000 milisekund.
To, co zrobiłem, aby to uwzględnić, to dodanie dodatkowych 3000 mili / s po każdym zwiększeniu pętli przez
delayTime += timeIncrement;
.Dla tych, którym zależy na tym, jak wygląda moje nextImage ():
źródło