Есть страница с неизвестным количеством кнопок. На каждую кнопку навешен обработчик onclick, который асинхронно выполняет какую-то функцию:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
$(function() {
$('input').click(function() {
var $button = $(this);
$button.attr('disabled', 'disabled');
setTimeout(function() {
$button.removeAttr('disabled');
}, 2000);
});
});
</script>
</head>
<body>
<input type="button" value="Button 1" />
<input type="button" value="Button 2" />
<input type="button" value="Button 3" />
</body>
</html>
Как сделать так, чтобы при нажатии подряд двух и более кнопок, onclick второй и последующей кнопки, вызывался только после завершения работы предыдущей. Т.е. если нажать подряд три кнопки, то первая должна стать неактивной, через две секунды она снова делается активной и тоже самое повторяется со второй кнопкой, а дальше и с третьей.
Сделал с костылём на очередях jquery. Может есть более красивое решение без дополнительных плагинов?
Update: оказывается если не использовать именнованную очередь, то первый вызов dequeue() можно опустить. Получается вроде красиво:
var $document = $(document);
$('input').click(function() {
var $button = $(this);
$document.queue(function() {
$button.attr('disabled', 'disabled');
setTimeout(function() {
$button.removeAttr('disabled');
$document.dequeue();
}, 2000);
});
});
});
Комментарии
Хммм по поводу click лучше использовать метод on так как он будет работать и для элементов которые будут добавлены в DOM без обновления обработчика.
нужна полноценная очередь без лишних проверок
http://jsfiddle.net/CjpmP/517/
В прошлом примере была куча ошибок.
Здесь их нет.
Обработчик выполниться только один раз.
Выключенные ранее кнопки обрабатываться не будут.
Последовательность нажатий сохраниться.
Если убрать проверку hasClass(pressed) можно делать бесконечную очередь.
Если убирать класс pressed в конце выполнения обработчика то в очередь снова можно снова добавить кнопку.
Возможно сортировать массив команд если установить индексы кнопок.
upd*
Щас выполняется не очередь а последовательность действий.
http://api.jquery.com/?ns0=1&s=Deferred+Objects