Ответ 1
Отличная Underscore.js имеет функцию дроссельной заслонки. Вы передаете обработчик, который вы хотите активировать, и верните ограниченную скоростью версию той же функции.
var throttled = _.throttle(someHandler, 100);
$(div).click(throttled);
http://documentcloud.github.com/underscore/#throttle
Вот упрощенная версия, которую я использовал в своем собственном коде:
function throttle(func, wait) {
var timeout;
return function() {
var context = this, args = arguments;
if (!timeout) {
// the first time the event fires, we setup a timer, which
// is used as a guard to block subsequent calls; once the
// timer handler fires, we reset it and create a new one
timeout = setTimeout(function() {
timeout = null;
func.apply(context, args);
}, wait);
}
}
}
Хороший способ проверить это, выпустив кучу событий прокрутки и просмотрев журнал обработчиков в консоли Firebug:
document.addEventListener("scroll", throttle(function() {
console.log("test");
}, 2000), false);
Здесь версия, которая ограничивает события click на событиях div
каждые 30 секунд, по запросу (требуется jQuery):
$("div").click(throttle(function() {
// ajax here
}, 30000));