#javascript #jquery #throttling
#javascript #jquery #регулирование
Вопрос:
Я хочу добавить удаление к кнопке, но я хочу выполнять некоторые действия каждый раз, когда пользователь нажимает кнопку, но только через 5 секунд после того, как пользователь нажимает кнопку, затем выполнить обновление SQL. Обычно дроссель, похоже, применяется непосредственно к слушателю. Здесь я хочу, чтобы некоторые действия выполнялись при каждом нажатии кнопки, а затем обновление после разумного периода ожидания.
Я не уверен, как использовать функцию в этом случае…
ссылка:http://code.google.com/p/jquery-debounce
$('#myButton').click(function() {
// do a date calculation
// show user changes to screen
// wait until user has has stopped clicking the
// button for 5 seconds, then update file with "process" function.
});
function process(){
// update database table
}
синтаксис деблокирования
$('input').bind('keyup blur', $.debounce(process, 5000));
Комментарии:
1. Итак, вы не знаете, как
$.debounce
работает или в чем ваша проблема? Редактировать: Ах, я понимаю….2. Я добавил подробности о своем вопросе. отклонение и регулирование — это шаблон, часто используемый в ajax. Вот несколько полезных советов… ajaxpatterns.org/Submission_Throttling
Ответ №1:
Вы все еще могли бы использовать $.debounce
вот так:
// create new scope
(function() {
// create debounced function
var dprocess = $.debounce(process, 5000);
// bind event handler
$('#myButton').click(function() {
// do a date calculation
// show user changes to screen
// call the function
dprocess();
});
}());
Альтернатива без $.debounce
(вы всегда можете удалить свой код таким образом, без jQuery):
// create new scope
(function() {
var timer;
// bind event handler
$('#myButton').click(function() {
if(timer) {
clearTimeout(timer);
}
// do a date calculation
// show user changes to screen
// call the function
timer = setTimeout(process, 5000);
});
}());
Комментарии:
1. Похоже, это правильное направление. Вы оборачиваете анонимную функцию вокруг процесса? Будет ли dprocess() находиться в области видимости при вызове?
2. Вы имеете в виду, будет ли это доступно из обработчика события click? ДА. Я добавил немедленный вызов функции, чтобы она
dprocess
не попадала в глобальную область видимости. Конечно, вы можете удалить это, если, например, ваш код все равно находится внутриready
обработчика событий.3. Очень хороший пример дебаунса без jQuery. Это почти сводит на нет необходимость в jQuery. Почти…
Ответ №2:
Отклонение с использованием native / vanilla JS и jquery/underscore.js .
Пример
JS
//Native/Vanilla JS
document.getElementById('dvClickMe').onclick = debounce(function(){
alert('clicked - native debounce');
}, 250);
function debounce(fun, mil){
var timer;
return function(){
clearTimeout(timer);
timer = setTimeout(function(){
fun();
}, mil);
};
}
//jQuery/Underscore.js
$('#dvClickMe2').click(_.debounce(function(){
alert('clicked - framework debounce');
}, 250));
HTML
<div id='dvClickMe'>Click me fast! Native</div>
<div id='dvClickMe2'>Click me fast! jQuery Underscore</div>
Ответ №3:
var timer;
$('#myButton').click(function() {
//Called every time #myButton is clicked
if(timer) clearTimeout(timer);
timer = setTimeout(process, 5000);
});
function process(){
//Called 5000ms after #myButton was last clicked
}
Ответ №4:
Использование глобальной переменной может быть не лучшим решением, если функция удаления используется для удаления нескольких функций. Для этого мы должны привязать таймер к запрещаемой функции.
function debounce(func, timeout = 2000) {
if (func.timer) clearTimeout(func.timer);
func.timer = setTimeout(func, timeout);
}
debounce(func1, 4000);
debounce(func2, 1000);
ПРИМЕЧАНИЕ: это не будет работать с анонимной функцией;
Ответ №5:
Почему бы просто не использовать setTimeOut(function() { process(); }, 5000);
Комментарии:
1. Как я понимаю, это просто добавляет задержку. Я хочу игнорировать начальные нажатия, а затем просто запустить обновление, когда пользователь успокоится на несколько секунд.
2. Достаточно справедливо. Вы могли бы реализовать это аналогичным образом без деблокирования, но, похоже, это, вероятно, правильный путь.