Javascript → Очередь событий в jQuery

11.07.2012

Дано — страница с неизвестным количеством кнопок. На каждую кнопку навешен обработчик onclick, который асинхронно выполняет какую-то функцию:

<input type="button" value="Button 1" />
<input type="button" value="Button 2" />
<input type="button" value="Button 3" />

<script>
$(function() {
    $('input').click(function() {
        var $button = $(this);
        $button.attr('disabled', 'disabled');
        setTimeout(function() {
            $button.removeAttr('disabled');
        }, 2000);
    });
});
</script>

Задача — поставить выполнение обработчиков onclick в очередь, т.е. чтобы каждый новый начинал работу только после завершения выполнения предыдущего.

Решение на jQuery.queue():

$(function() {
    var $document = $(document);
    $('input').click(function() {
        var $button = $(this);
        // добавляем код в очередь
        $document.queue(function() {
            $button.attr('disabled', 'disabled');
            setTimeout(function() {
                $button.removeAttr('disabled');
                // по завершению вызываем следующую функцию в очереди
                $document.dequeue();
            }, 2000);
        });
    });
});

Демо.

Похожие записи

Комментарии

Гость
12.10.2012, 15:30

Спасибо за пост. Просто и понятно.

Андрей
25.12.2013, 18:44

На кану встретилась аналогичная задача - разрулил так:

(function($){
  $('body').once(function () { 
    window.setInterval(function() {
      $(document).queue(function() {

        /* Какой-то код */    

        $(document).dequeue();
      });
      return true;
    }, 5000);
  });
})(jQuery);

Добавить комментарий