Добавление задержки в запрос jquery $.post

Я отправляю запрос jquery $.post при любом изменении флажка в форме. Я хочу задержать $.post на 500 мс, если пользователь быстро проверяет более одного флажка, чтобы избежать нескольких бесполезных запросов.

Вот мой код, я добавил функцию setTimeout, которая работает со всем, кроме этой функции $.post...

var delay = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();

$(document).ready(function() {  

    $('.checkbox').change(function() {

        delay(function(){                             
            $.post("/?page_id=4", $("#selectors").serialize(), function(data){
                $('#results').html(data);
            }); 
        });

    }, 1000 );

});

Любая идея, почему это не работает?


person Phil    schedule 04.03.2011    source источник
comment
Я обычно использую setTimeout вот так: timer = window.setTimeout(function, 1000);   -  person ipalaus    schedule 04.03.2011
comment
Разве }, 1000 не в том месте? Разве это не должно быть вторым аргументом функции delay() вместо функции change()?   -  person Elian Ebbing    schedule 04.03.2011
comment
@ЭлианЭббинг @Фил, что говорит Элиан. Вы передаете 1000 .change. Также по умолчанию timer на undefined, иначе вы случайно убьете setTimeout с помощью id === 0   -  person Raynos    schedule 04.03.2011
comment
@ElianEbbing, вы абсолютно правы, я пропустил это, спасибо, что указали на это!   -  person Phil    schedule 04.03.2011


Ответы (2)


Живой пример

это:

$('.checkbox').change(function() {

    delay(function(){                             
        $.post("/?page_id=4", $("#selectors").serialize(), function(data){
            $('#results').html(data);
        }); 
    });

}, 1000 );

должно быть:

    $('.checkbox').change(function() {

        delay(function(){    
            alert('post');            
            $.post("/?page_id=4", $("#selectors").serialize(), function(data){
                $('#results').html(data);
            }); 
        }, 1000);

    });
person subhaze    schedule 04.03.2011
comment
Это сработало отлично! Не могу поверить, что я пропустил это. Большое спасибо. - person Phil; 04.03.2011
comment
Да, я ненавижу, когда делаю что-то подобное, но это случается со всеми нами в какой-то момент :P - person subhaze; 04.03.2011

jQuery уже имеет функцию задержки:

$(window).delay(500).queue(function() {
  $.post({});
});
person sod    schedule 04.03.2011
comment
Обновление: я добавил $.dequeue(), и он запускается столько раз, сколько вы нажимаете на флажок, только с интервалами, поэтому он превосходит цель. - person raveren; 03.05.2012