У меня есть этот кусок 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();
});
});
javascript
jquery
Синий оранжевый
источник
источник
setTimeout(function(){/*YourCode*/},1000);
.stop()
хотя. Посмотрите здесь api.jquery.com/stopОтветы:
Используйте
setTimeout()
:Если вы хотите сделать это без
setTimeout
: Обратитесь к этому вопросу .источник
Разместите свой код внутри
{ }
500
= 0,5 секунды2200
= 2,2 секундыи т.п.
источник
ES-6 Solution
Ниже приведен пример кода, который использует aync / await для фактической задержки.
Есть много ограничений, и это может быть бесполезно, но просто размещать здесь для удовольствия ..
источник
delay
функция была асинхронной. Эта удивительная задержка срабатывает, когда Promise, возвращаемое обычной функцией, ожидается в теле асинхронной функции.Существует два (в основном используемых) типа функции таймера в javascript
setTimeout
иsetInterval
( другое )Оба эти метода имеют одинаковую подпись. Они принимают функцию обратного вызова и время задержки в качестве параметра.
setTimeout
выполняется только один раз после задержки, тогда какsetInterval
продолжает вызывать функцию обратного вызова после каждой задержки milisecs.оба эти метода возвращают целочисленный идентификатор, который можно использовать для очистки их до истечения таймера.
clearTimeout
иclearInterval
оба эти метода принимают целочисленный идентификатор, возвращенный из вышеуказанных функцийsetTimeout
иsetInterval
Пример:
SetTimeout
Если вы запустите приведенный выше код, вы увидите, что он предупреждает,
before setTimeout
а затем,after setTimeout
наконец, он предупреждаетI am setTimeout
через 1сек (1000 мс)Из этого примера вы можете заметить, что
setTimeout(...)
он асинхронный, что означает, что он не ожидает истечения таймера, прежде чем перейти к следующему выражению, т.е.alert("after setTimeout");
Пример:
setInterval
Если вы запустите приведенный выше код, вы увидите, что он предупреждает,
before setInterval
а затем,after setInterval
наконец, он предупреждаетI am setInterval
5 раз через 1 с (1000 мс), потому что setTimeout сбрасывает таймер через 5 секунд, а в противном случае каждую 1 секунду вы будете получать оповещениеI am setInterval
бесконечно.Как внутренний браузер это делает?
Я объясню вкратце.
Чтобы понять, что вы должны знать об очереди событий в JavaScript. В браузере реализована очередь событий. Всякий раз, когда событие запускается в js, все эти события (например, щелчок и т. Д.) Добавляются в эту очередь. Когда вашему браузеру нечего выполнять, он берет событие из очереди и выполняет их одно за другим.
Теперь, когда вы звоните
setTimeout
илиsetInterval
ваш обратный вызов регистрируется в таймере в браузере, он добавляется в очередь событий по истечении заданного времени, и в конечном итоге javascript берет событие из очереди и выполняет его.Это происходит так, потому что движок javascript является однопоточным и может выполнять только одну вещь за раз. Таким образом, они не могут выполнять другие JavaScript и отслеживать ваш таймер. Вот почему эти таймеры зарегистрированы в браузере (браузер не является однопоточным), и он может отслеживать таймер и добавлять событие в очередь после истечения таймера.
то же самое происходит,
setInterval
только в этом случае событие снова и снова добавляется в очередь по истечении заданного интервала, пока оно не будет очищено или страница браузера обновлена.Следовательно, ваш обратный вызов может иногда требовать больше, чем указанное время задержки, чтобы вызываться специально, когда ваш другой код блокирует поток и не дает ему времени для обработки того, что находится в очереди.
И, как я уже упоминал, javascript - это один поток. Так что, если вы заблокируете поток на долго.
Как этот код
Ваш пользователь может получить сообщение о том, что страница не отвечает .
источник
setTimeout
если вы не хотите асинхронного поведения.Для синхронизации вызовов вы можете использовать метод ниже:
источник
Если вам нужно обновить, это еще одна возможность:
источник
Вот что я делаю, чтобы решить эту проблему. Я согласен, что это из-за проблемы с синхронизацией, и ему понадобилась пауза для выполнения кода.
Этот новый код приостановит его на 1 секунду и тем временем запустит ваш код.
источник
Я внесу свой вклад, потому что это помогает мне понять, что я делаю.
Чтобы сделать слайд-шоу с автоматической прокруткой, которое длится 3 секунды, я сделал следующее:
Помните, что при выполнении setTimeout () вот так; он будет выполнять все функции времени ожидания, как если бы они выполнялись одновременно, предполагая, что в setTimeout (nextImage, delayTime) время задержки составляет статические 3000 миллисекунд.
Для этого я добавил дополнительные 3000 милли / с после каждого для увеличения цикла через
delayTime += timeIncrement;
.Для тех, кому все равно, вот как выглядит мой nextImage ():
источник