Περισσότερα
Πώς να ορίσετε χρονική καθυστέρηση σε javascript
Έχω αυτό το κομμάτι js στην ιστοσελίδα μου για να αλλάζω εικόνες, αλλά χρειάζομαι μια καθυστέρηση όταν κάνετε κλικ στην εικόνα για δεύτερη φορά. Η καθυστέρηση πρέπει να είναι 1000ms. Έτσι, θα κάνετε κλικ στο img.jpg και στη συνέχεια θα εμφανιστεί το img_onclick.jpg. Στη συνέχεια, θα κάνετε κλικ στην εικόνα img_onclick.jpg και στη συνέχεια θα πρέπει να υπάρχει μια καθυστέρηση 1000ms πριν εμφανιστεί ξανά η εικόνα img.jpg.
Ακολουθεί ο κώδικας:
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
Χρησιμοποιήστε την
setTimeout()
:Αν θέλετε να το κάνετε χωρίς
setTimeout
: Ανατρέξτε στην αυτή την ερώτηση.Τοποθετήστε τον κώδικά σας μέσα στο
{ }
500
= 0,5 δευτερόλεπτα2200
= 2,2 δευτερόλεπτακ.λπ.
Υπάρχουν δύο (κυρίως χρησιμοποιούμενοι) τύποι συνάρτησης χρονοδιακόπτη στη javascript
setTimeout
καιsetInterval
(other)Και οι δύο αυτές μέθοδοι έχουν την ίδια υπογραφή. Παίρνουν ως παράμετρο μια συνάρτηση ανάκλησης και το χρόνο καθυστέρησης.
Η
setTimeout
εκτελείται μόνο μία φορά μετά την καθυστέρηση ενώ ηsetInterval
συνεχίζει να καλεί τη συνάρτηση ανάκλησης μετά από κάθε χιλιοστά του χιλιοστού της καθυστέρησης.Και οι δύο αυτές μέθοδοι επιστρέφουν ένα ακέραιο αναγνωριστικό που μπορεί να χρησιμοποιηθεί για την εκκαθάρισή τους πριν από τη λήξη του χρονοδιακόπτη.
clearTimeout
καιclearInterval
και οι δύο αυτές μέθοδοι λαμβάνουν ένα ακέραιο αναγνωριστικό που επιστρέφεται από τις παραπάνω συναρτήσειςsetTimeout
καιsetInterval
.Παράδειγμα:
setTimeout
Αν εκτελέσετε τον παραπάνω κώδικα θα δείτε ότι ειδοποιεί
πριν το setTimeout
και στη συνέχειαμετά το setTimeout
τελικά ειδοποιείΕίμαι setTimeout
μετά από 1sec (1000ms)Αυτό που μπορείτε να παρατηρήσετε από το παράδειγμα είναι ότι το
setTimeout(...)
είναι ασύγχρονο, που σημαίνει ότι δεν περιμένει να παρέλθει ο χρονοδιακόπτης πριν προχωρήσει στην επόμενη εντολή δηλαδήalert("after setTimeout");
Παράδειγμα:
setInterval
Αν τρέξετε τον παραπάνω κώδικα θα δείτε ότι ειδοποιεί
πριν το setInterval
και μετάμετά το setInterval
τελικά ειδοποιείΕίμαι setInterval
5 φορές μετά από 1sec (1000ms) επειδή το setTimeout καθαρίζει το χρονόμετρο μετά από 5 δευτερόλεπτα ή αλλιώς κάθε 1 δευτερόλεπτο θα λαμβάνετε ειδοποίησηΕίμαι setInterval
Απεριόριστα.Πώς το κάνει αυτό το πρόγραμμα περιήγησης εσωτερικά;
Θα σας εξηγήσω εν συντομία.
Για να το καταλάβετε αυτό θα πρέπει να ξέρετε για την ουρά γεγονότων στην javascript. Υπάρχει μια ουρά γεγονότων που υλοποιείται στο πρόγραμμα περιήγησης. Κάθε φορά που ενεργοποιείται ένα συμβάν στο js, όλα αυτά τα συμβάντα (όπως κλικ κ.λπ...) προστίθενται σε αυτή την ουρά. Όταν το πρόγραμμα περιήγησης δεν έχει τίποτα να εκτελέσει, παίρνει ένα συμβάν από την ουρά και τα εκτελεί ένα προς ένα.
Τώρα, όταν καλείτε το
setTimeout
ή τοsetInterval
, το callback σας καταχωρείται σε έναν χρονοδιακόπτη στο πρόγραμμα περιήγησης και προστίθεται στην ουρά συμβάντων μετά τη λήξη του συγκεκριμένου χρόνου και τελικά το javascript παίρνει το συμβάν από την ουρά και το εκτελεί.Αυτό συμβαίνει έτσι, επειδή η μηχανή javascript είναι single threaded και μπορεί να εκτελέσει μόνο ένα πράγμα κάθε φορά. Έτσι, δεν μπορούν να εκτελέσουν άλλο javascript και να παρακολουθούν το χρονοδιακόπτη σας. Αυτός είναι ο λόγος για τον οποίο αυτοί οι χρονοδιακόπτες είναι εγγεγραμμένοι στο πρόγραμμα περιήγησης (το πρόγραμμα περιήγησης δεν είναι single threaded) και μπορεί να παρακολουθεί το χρονοδιακόπτη και να προσθέτει ένα συμβάν στην ουρά μετά τη λήξη του χρονοδιακόπτη.
το ίδιο συμβαίνει και για το
setInterval
μόνο που σε αυτή την περίπτωση το συμβάν προστίθεται στην ουρά ξανά και ξανά μετά το καθορισμένο χρονικό διάστημα μέχρι να διαγραφεί ή να ανανεωθεί η σελίδα του προγράμματος περιήγησης.Ως εκ τούτου, το callback σας μπορεί κάποια στιγμή να πάρει περισσότερο από τον καθορισμένο χρόνο καθυστέρησης για να κληθεί ειδικά όταν ο άλλος κώδικάς σας μπλοκάρει το νήμα και δεν του δίνει χρόνο να επεξεργαστεί ό,τι υπάρχει στην ουρά.
Και όπως ανέφερα η javascript είναι μονόκλωνη. Έτσι, αν μπλοκάρετε το νήμα για πολύ ώρα.
Όπως αυτός ο κώδικας
Ο χρήστης σας μπορεί να λάβει ένα μήνυμα που λέει η σελίδα δεν ανταποκρίνεται.