javascript / jquery — добавить удаление к кнопке

#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. Достаточно справедливо. Вы могли бы реализовать это аналогичным образом без деблокирования, но, похоже, это, вероятно, правильный путь.