kzen.dev
  • Питання
  • Мітки
  • Користувачі
Сповіщення
Нагороди
Реєстрація
Після реєстрації ви отримаєте повідомлення про відповіді та коментарі на свої запитання.
Ввійти
Якщо у вас вже є обліковий запис, увійдіть, щоб перевірити нові сповіщення.
За додані запитання, відповіді та коментарі будуть винагороди.
Ще
Джерело
Редагувати
Blue Orange
Blue Orange
Question

Як встановити затримку часу в javascript

У мене є цей шматок js на моєму веб-сайті для перемикання зображень, але мені потрібна затримка, коли ви натискаєте на зображення вдруге. Затримка повинна становити 1000 мс. Таким чином, ви натискаєте img.jpg, а потім з'являється img_onclick.jpg. Потім ви натискаєте на зображення img_onclick.jpg, після чого повинна бути затримка в 1000 мс, перш ніж знову з'явиться зображення 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 2013-07-26T14:13:30+00:00 3
Manoj Sharma
Manoj Sharma
Edited question 27-го червня 2017 в 9:56
Програмування
javascript
jquery
This question has 1 відповідь in English, to read them log in to your account.
Solution / Answer
HIRA THAKUR
HIRA THAKUR
26-го липня 2013 в 2:15
2013-07-26T14:15:11+00:00
Ще
Джерело
Редагувати
#20042078

Використовуйте setTimeout():

var delayInMilliseconds = 1000; //1 second

setTimeout(function() {
  //your code to be executed after 1 second
}, delayInMilliseconds);

Якщо ви хочете зробити це без setTimeout: Зверніться до цього питання.

 jegtugado
jegtugado
Edited answer 27-го жовтня 2017 в 2:21
335
0
 maudulus
maudulus
10-го жовтня 2014 в 7:05
2014-10-10T19:05:58+00:00
Ще
Джерело
Редагувати
#20042079
setTimeout(function(){

}, 500); 

Помістіть свій код всередину { }.

500 = 0.5 секунди

2200 = 2.2 секунди

і т.д.

 maudulus
maudulus
Edited answer 29-го листопада 2016 в 8:17
43
0
Nadir Laskar
Nadir Laskar
2-го червня 2017 в 7:49
2017-06-02T19:49:18+00:00
Ще
Джерело
Редагувати
#20042080

Існує два (найбільш вживаних) типи функцій таймерів в javascript setTimeout та setInterval (інше)

Обидва ці методи мають однакову сигнатуру. Вони приймають функцію зворотного виклику і час затримки в якості параметра.

setTimeout виконується тільки один раз після затримки, в той час як setInterval продовжує викликати функцію зворотного виклику через кожні мілісекунди затримки.

Обидва ці методи повертають цілочисельний ідентифікатор, який може бути використаний для їх очищення до закінчення таймера.

clearTimeout і clearInterval обидва ці методи приймають цілочисельний ідентифікатор, що повертається з вищевказаних функцій setTimeout і setInterval.

**Приклад

setTimeout

alert("before setTimeout");

setTimeout(function(){
        alert("I am setTimeout");
   },1000); //delay is in milliseconds 

  alert("after setTimeout");

Якщо ви запустите вищенаведений код, ви побачите, що він сповіщає про "до закінчення часу очікування ", а потім "після закінчення часу очікування ", нарешті, він сповіщає про "I am setTimeout " через 1 секунду (1000 мс).

З прикладу можна помітити, що setTimeout(...) є асинхронним, що означає, що він не чекає закінчення таймера, перш ніж перейти до наступного оператора, тобто alert("after setTimeout");.

**Приклад

setInterval

alert("before setInterval"); //called first

 var tid = setInterval(function(){
        //called 5 times each time after one second  
      //before getting cleared by below timeout. 
        alert("I am setInterval");
   },1000); //delay is in milliseconds 

  alert("after setInterval"); //called second

setTimeout(function(){
     clearInterval(tid); //clear above interval after 5 seconds
},5000);

Якщо ви запустите вищенаведений код, ви побачите, що він сповіщає before setInterval, а потім after setInterval, нарешті, він сповіщає I am setInterval 5 разів через 1 секунду (1000 мс), тому що setTimeout очистить таймер через 5 секунд, інакше кожну 1 секунду ви отримуватимете сповіщення I am setInterval Infinitely.

**Як це робить браузер всередині?

Поясню коротко.

Щоб зрозуміти, що це таке, потрібно знати про чергу подій в javascript. У браузері реалізована черга подій. Кожного разу, коли в js спрацьовує подія, всі ці події (такі як клік і т.д.) додаються в цю чергу. Коли браузеру нема чого виконувати, він бере події з черги і виконує їх по черзі.

Тепер, коли ви викликаєте setTimeout або setInterval, ваш зворотній виклик реєструється на таймер в браузері, і він додається в чергу подій після закінчення заданого часу, і в кінцевому підсумку javascript бере подію з черги і виконує її.

Це відбувається так, тому що движок javascript є однопоточним і може виконувати тільки одну річ одночасно. Отже, вони не можуть виконувати інший javascript і відслідковувати ваш таймер. Саме тому ці таймери реєструються в браузері (браузер не є однопоточним) і він може відстежувати таймер і додавати подію в чергу після закінчення таймера.

Те ж саме відбувається і для setInterval, тільки в цьому випадку подія додається в чергу знову і знову через заданий інтервал часу, поки вона не буде очищена або не оновиться сторінка браузера.

Примітка Параметр затримки; Параметр delay, який ви передаєте цим функціям, є мінімальною затримкою часу для виконання зворотного виклику. Це пов'язано з тим, що після закінчення таймеру браузер додає подію в чергу на виконання двигуном движком javascript, але виконання зворотного виклику залежить від вашої позиції події в черзі і так як движок однопотоковий, то він виконає всі події в черзі по черзі.

Таким чином, ваш зворотній виклик може іноді займати більше зазначеного часу затримки, особливо коли ваш інший код блокує потік і не дає йому часу обробити те, що знаходиться в черзі.

І як я вже згадував, javascript є однопотоковим. Отже, якщо ви блокуєте потік надовго.

Наприклад, такий код

while(true) { //infinite loop 
}

Ваш користувач може отримати повідомлення про те, що сторінка не відповідає.

Nadir Laskar
Nadir Laskar
Edited answer 9-го червня 2017 в 6:37
11
0
Related communities 2
NodeUA - JavaScript and Node.js in Ukraine
NodeUA - JavaScript and Node.js in Ukraine
2 936 users
Группа по Node.js сообщества Метархия. Ссылки на митапы, группы и каналы сообщества https://github.com/HowProgrammingWorks/Index/blob/master/Links.md
Open telegram
JS різноробочий | Fullstack JavaScript 🏆 UA
JS різноробочий | Fullstack JavaScript 🏆 UA
215 users
Мова спільноти: Українська. З нами ти зможеш пройти шлях від Junior до Senior. Важливо не вживати мета запитань у группі та поводити себе чемно. Доступні хештеги: #memes - меми чи смішні історії.
Open telegram
Додати питання
Категорії
Все
Технологія
Культура / Відпочинок
Життя / Мистецтво
Наука
Професіонал
Бізнес
Користувачі
All
New
Popular
1
Роман Азаров
Registered 2 дні тому
2
Mansur Zakirov
Registered 5 днів тому
3
Тагир Мамедов
Registered 1 тиждень тому
4
Алексей Толманов
Registered 1 тиждень тому
5
Valeriu Vodnicear
Registered 2 тижні тому
DA
DE
EL
ES
FI
FR
ID
IT
JA
LV
NL
PL
PT
TR
UK
ZH
© kzen.dev 2023
Джерело
stackoverflow.com
за ліцензією cc by-sa 3.0 з атрибуцією