2011-03-04 163 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