2011-03-04 14 views
8

Estoy enviando una solicitud jquery $ .post en cualquier cambio de casilla de verificación en un formulario. Lo que quiero es retrasar $ .post por 500 ms en caso de que un usuario verifique más de una casilla rápidamente, para evitar múltiples solicitudes inútiles.

Aquí está mi código, he añadido una función setTimeout que parece funcionar con todo excepto esta función $ .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); 

}); 

Cualquier idea de por qué esto no funciona?

+0

normalmente utilizo setTimeout así: 'temporizador = window.setTimeout (función , 1000); ' – ipalaus

+2

¿No está el"}, 1000 "en el lugar incorrecto? ¿No debería ser el segundo argumento de la función delay() en lugar de la función change()? –

+1

@ElianEbbing @Phil lo que dice Elian. Su paso '1000' a' .change'. También por defecto 'timer' a' undefined' o accidentalmente matará 'setTimeout' con' id === 0' – Raynos

Respuesta

12

Live example

esto:

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

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

}, 1000); 

debería ser:

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

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

    }); 
+0

¡Esto funcionó perfectamente! No puedo creer que me haya perdido eso. Muchas gracias. – Phil

+0

Sí, odio cuando hago algo así, pero nos sucede a todos en algún momento: P – subhaze

5

jQuery ya cuenta con una función de retardo:

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

esto de alguna manera solo se ejecuta una vez: http://jsfiddle.net/nGTN4/9/ – raveren

+0

Actualización: he agregado $ .dequeue() y se ejecuta tantas veces como se presiona la casilla, solo con intervalos, por lo que late el propósito. – raveren

Cuestiones relacionadas