#javascript #toggle #intervals
#javascript #переключить #интервалы
Вопрос:
Я использую JS для анимации двух изображений, включая и выключая их. У меня есть исходное изображение, которое при включении анимации появляется на экране и остается включенным. Затем второе изображение, которое имеет более высокое значение z, включается и выключается каждые 1 секунду в том же месте, что и первое изображение, поэтому создается впечатление, что они чередуются.
Я использую window.setInterval, чтобы заставить второе изображение мигать, но когда мне нужно отключить анимацию (и я удаляю оба изображения с экрана), мой window.clearInterval не «работает», первое изображение исчезнет, но второе продолжает мигать каждую секунду.
Код:
function notebookNotification(setting)
{
$("#lightNotificationContainer").show();
var notificationAnimation = window.setInterval('$("#darkNotificationContainer").toggle()', 1000);
if(setting == 0)
{
window.clearInterval(notificationAnimation);
$("#lightNotificationContainer").hide();
$("#darkNotificationContainer").hide();
}
}
Кто-нибудь видит, почему это не работает?
Комментарии:
1. У вас есть тестовый пример? Я предполагаю, что это связано с тем фактом, что notificationAnimation был объявлен в области действия функции notebookNotification, поэтому вы не можете снова ссылаться на эту переменную после того, как функция была запущена один раз. Попробуйте сохранить интервал в глобальной переменной.
Ответ №1:
Читая между строк, я думаю, что вы хотите сказать следующее:
- Вы выполняете
notebookNotification(1);
, и начинается анимация - Вы выполняете,
notebookNotification(0);
а анимация не останавливается.
Я предполагаю, что вы хотите notebookNotification(0)
отключить мигание.
Чтобы сделать это, вам нужно значительно переработать эту функцию. Вам нужно сохранить то, intervalID
что поступает из setInterval
, в переменной, которая сохраняется за пределами области видимости этой функции и может быть использована для clearInterval
последующих вызовов этой функции.
Например:
var intervalID;
function notebookNotification(setting)
{
if(setting == 0)
{
if(intervalID) {
window.clearInterval(intervalID);
intervalID = null;
}
$("#lightNotificationContainer").hide();
$("#darkNotificationContainer").hide();
}
else
{
$("#lightNotificationContainer").show();
if(!intervalID) {
intervalID = window.setInterval('$("#darkNotificationContainer").toggle()', 1000);
}
}
}
Комментарии:
1. Ах, теперь это работает как по волшебству. Я вижу, что мне нужно было сохранить свой интервал вне функции; Я подумал, что, поскольку он был объявлен внутри, он все равно будет находиться в области видимости бла-бла-бла. Спасибо за вашу помощь!!!
2. На самом деле, поскольку вы объявляете его внутри, он выходит за пределы области видимости, когда функция завершается. Могут быть лучшие способы сохранить этот intervalID без загрязнения глобального пространства имен (возможно, с использованием jQuery.data), но этот код является быстрой и грязной версией
Ответ №2:
Вот, попробуйте это:
Сохранение интервала в глобальную переменную — не внутри функции — позволяет вам очистить его позже.
Комментарии:
1. Кто-то опередил вас, но да, это была моя проблема, не имея ее в качестве глобальной переменной. Спасибо за ваше время!
Ответ №3:
var keepflashing = true;
var isShowing = true;
function notebookNotification()
{
if(!isShowing)
$("#lightNotificationContainer").show();
else
$("#lightNotificationContainer").show();
isShowing = !isShowing;
if(keepflashing)
setTimeout( function(){ notebookNotification(setting); },100);
else
{
$("#lightNotificationContainer").hide();
$("#darkNotificationContainer").hide();
}
}
Комментарии:
1. Я думал о рекурсивном выполнении этой функции. Похоже, этот способ тоже сработал бы
Ответ №4:
Может быть, вы можете вообще не вызывать clearInterval()?
function notebookNotification(setting)
{
if(setting == 0)
{
$("#lightNotificationContainer").hide();
$("#darkNotificationContainer").hide();
}
else
{
$("#lightNotificationContainer").show();
window.setInterval('$("#darkNotificationContainer").toggle()', 1000);
}
}
Комментарии:
1. Если я не очищу интервал, он будет продолжать включать и выключать darkNotificationContainer, даже если я «скрою» его. Скрытие выполняется только один раз, в то время как интервал будет продолжать переключаться, тем самым снова включая его… и выключен … и включен … и т.д.
2. Вызываете ли вы notebookNotification () более одного раза?
3. ДА. Хотя на вопрос был дан ответ, но спасибо за ваше время!!