2012-01-30 6 views
2

Я ищу простой семантический способ кодирования jQuery, который позволяет разумный тайм-аут или другой способ «замедления» скорости, с которой увольняются события, для того, чтобы чтобы пользователь не мог рассылать спам (специально или невольно) мои обработчики.jQuery - как остановить использование обработчиков событий spamming

Это обычно не касается меня лично, так как в большинстве случаев достаточно просто прекратить работу предыдущего обработчика - например, это затухающее меню; просто используя .stop() на анимации достаточно.

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

Пример задачи:

$(document).bind('mousewheel', function(e, delta){ 
    alert('you scrolled the mousewheel!'); 
    stopLoadsOfStuff(); 
    fadeHalfADozenImagesInAndOutAgain(); 
}); 

Я использую плагин (колеса мыши здесь: http://brandonaaron.net/code/mousewheel/docs) в зависимости от мыши, операционной системы или производителя программного обеспечения поставляется, скорость прокрутки может отличаться друг от друга. Подумайте, одна из тех блестящих мышей с яблочным прикосновением против старой шаровой мыши от 90-х годов. Если вы запускаете событие в прокрутке, вы обнаружите, что вам нужно ограничить его чем-то разумным, если ваше мероприятие очень дешево для выполнения и остановки.

Вещи я уже пробовали это:

Для кликов и событий клавиатуры:

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

Для MouseWheel событий:

Я увеличиваем целочисленную переменную каждый раз, когда обнаруживается событие MouseWheel, и только принять меры, если это больше, чем 5. Обработчик сбрасывает его в 0 при выполнении.

Т.Л., др

Мне нужен расширяемый, простой способ ограничить скорость выполнения обработчиков событий, которое позволит мне использовать дорогие обработчик событий, не беспокоясь о пользователе попытки выполнить их 100 раз в второй :)

Любая помощь оценили

+1

Вы ищете ** событие debouncing/throttling **. Не знаю, достаточно ли этого для ваших целей: http://benalman.com/projects/jquery-throttle-debounce-plugin/ –

ответ

2

Вы можете быть заинтересованы в jQuery debounce plugin.

Концепция плагина заключается в том, что он переносит обработчик, который вы передаете в другую функцию, которая ограничивает выполнение функции, только называя ее каждый x миллисекунд.

+0

Это очень близко к тому, что мне нужно - я попробую, спасибо – jammypeach

+0

может ' t получить это, чтобы работать - jQuery 1.7.x может не поддерживаться :( – jammypeach

+0

царапины, что последний, понял это :) – jammypeach

Смежные вопросы