Вы здесь

Как остановить таймер, созданный с помощью setInterval?

0

Всем привет. делаю тайм трекинг для ноды с помощью флагов и немного своего кода.
все отлично работает, но есть необходимость в визуализации этого таймера. чтобы при клике на флаг, часики пошли, при клике еще раз, остановились.

пытаюсь сделать это с помощью функции setInterval.

Таймер запускается, все отлично но никак не могу остановить.
Подскажите, пожалуйста что не так. уже второй день бьюсь над этим.

вот пример начального кода.

(function ($, Drupal, window, document) {
  'use strict';
 Drupal.behaviors.prjTimer= {
     attach: function (context, settings) {

         var t = [];
         var count = 0;

 $('.flag-project-timer').bind('flagGlobalAfterLinkUpdate', function(event, data) {
     var nodeID = data.contentId;

        if (data.flagName == 'project_timer' && data.flagStatus == 'flagged') {        
            t[nodeID] = setInterval(function () {
                ++count;
                $('#timer-' + nodeID + ' .TimerStart').html(count);   
            }, 1000); 
        }

     if (data.flagName == 'project_timer' && data.flagStatus == 'unflagged') {  
              clearInterval(t[nodeID]); 
      }   
 });        
}
};
})(jQuery, Drupal, this, this.document);



Версия Drupal: 
7.x
Категория: 
Javascript
Вопрос задан 17.06.2017 - 10:17
Аватар пользователя Denis
Denis
58

Пишите в заголовке суть вопроса. Вопросы без нормальных заголовков будут удаляться.

Комментарий оставлен 17.06.2017 - 11:54

я и указываю ему clearInterval(t[nodeID]);
т.к. на странице может быть запущенно одновременно несколько таймеров, запихиваю setInterval для каждого таймера в массив с ключом ID ноды.
но clearInterval не срабатывает

Комментарий оставлен 17.06.2017 - 13:54

Немного продвинулся.
при отметке флага, если на странице один таймер, все отлично. если больше 1го, то на каждый флаг создается 4(!!!) setInterval
почему так, не могу понять ((

Комментарий оставлен 17.06.2017 - 14:26

Не верю что то, накосячили с условиями наверное. перепроверьте всё через console.log() так, как clearInterval это единственный способ.

Комментарий оставлен 17.06.2017 - 14:45

в консоль как и думал выводит 4 таймера (по 2 на каждый флаг)
как я понял, эта проблема возникает из-за того что флаг аяксофицирован.
если в настройках флага переключить на просто линку, и обработчик вешать на определенный объект, то все норм.

Комментарий оставлен 17.06.2017 - 15:28

Спасибо, once помог. Теперь таймеры создаются правильно, и стопятся отлично.
как всегда есть НО )))

если один таймер запущен, по моему примеру, он каждую секунду делает count+1 и пишет в html селектора.
$('#timer-' + nodeID + ' .TimerStart').html(count);
т.е. для каждой ноды свой отдельный таймер.

так вот, если запустить одновременно, например 2 таймера, все они срабатывают только на последний $('#timer-' + nodeID + ' .TimerStart').html(count); и выходит что каждую секунду делает +1 к count с каждого запущенного таймера, и выводит это не к каждой ноде свое, а все вместе на последнюю ноду с запущенным таймером (

Комментарий оставлен 19.06.2017 - 11:23

Ответы