Я для этого придумывал небольшой паттерн:
$(element).one("click", function () {
var self = $(this), callee = arguments.callee;
self.animate({ ... }, 1000, function () {
self.one("click", callee);
});
});
Т.е. навешиваем на элемент обработчик, который сработает только один раз (.one() же) и когда анимация закончилась, навешиваем его вновь.