2011-03-04 103 views
8

我发送一个jQuery $ .post请求在窗体中的任何复选框更改。 我想要的是将$ .post延迟500毫秒,以防用户快速检查多个复选框,以避免多次无用的请求。

这里是我的代码,我添加了似乎与此除外.post的$功能一切工作setTimeout函数...

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); 

}); 

知道为什么这不起作用?

+0

我通常使用的setTimeout这样的:'计时器= window.setTimeout(函数,1000);' – ipalaus 2011-03-04 14:30:50

+2

是不是“},1000”在错误的地方?它不应该是delay()函数的第二个参数,而不是change()函数? – 2011-03-04 14:32:06

+1

@ElianEbbing @Phil Elian说。你将'1000'传递给'.change'。另外默认'timer'为'undefined',否则你会不小心使用'id === 0'终止'setTimeout'' – Raynos 2011-03-04 14:34:45

回答

12

Live example

这样的:

$('.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); 

    }); 
+0

这工作完美!不能相信我错过了。非常感谢。 – Phil 2011-03-04 14:42:53

+0

是的,我讨厌当我做那样的事情时,它发生在某种程度上:P – subhaze 2011-03-04 14:48:14

5

的jQuery已经有一个延时功能:

$(window).delay(500).queue(function() { 
    $.post({}); 
}); 
+0

这不知何故只能运行一次:http://jsfiddle.net/nGTN4/9/ – raveren 2012-05-03 16:21:53

+0

更新:我已经添加了$ .dequeue(),并且它运行的次数与您按下复选框时一样多,所以它会跳动目的。 – raveren 2012-05-03 16:27:54