2010-08-30 92 views
1

我正在通过自动完成功能来浏览窗体的各个步骤。以下是在输入5个字符时输入下一个元素的代码。我的延迟效果很好,但如果字符在输入5个字符后被删除,我无法阻止它完成。无论输入内容发生了什么变化,它都会立即引发焦点。中断jQuery延迟功能

有什么想法?

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

$('input').keyup(function(){ 
    if($(this).val().length == 5) { 
     delay(function(){ $("#saveForm2").focus(); }, 2000); 
    } 
}) 
+0

我没有看到你使用jQuery的'.delay()'方法。 – user113716 2010-08-30 22:44:39

+0

其实我不是,我在写出主题时忽略了这个事实,这是一个自定义延迟功能 – stephenway 2010-08-30 22:54:41

回答

3

如果您正在寻找将超时实例与元素相关联的简单方法,请考虑使用jQuery的.data()方法。

就是这样。

$('input').keyup(function() { 
    var $th = $(this); 
    var data = $th.data(); 
    if(data.timeout === undefined) { 
     data.timeout = null; 
    } 
    if ($th.val().length == 5) { 
     clearTimeout(data.timeout); 
     data.timeout = setTimeout(function() { 
      $("#saveForm2").focus(); 
     }, 2000); 
    } else { 
     clearTimeout(data.timeout); 
    } 
});​ 

我不认为你使用闭包的方式非常正确。我认为你需要将处理程序分配给闭包中的元素,所以它有一个本地引用实例。

编辑:使用更早的存储引用data()更有效。

0

每次调用delay()时候,你揍你的超时处理,这意味着你不能在事后管理。这也意味着,如果我正确阅读,每次打到5个字符时都会发出请求。尝试是这样的:

var delayTimer; 
var nextField = function() { $("#saveForm2").focus(); } 
$('input').keyup(function(){ 
    clearTimeout(delayTimer); 
    if($(this).val().length >= 5) { 
    delayTimer = setTimeout(nextField, 2000); 
    } 
}) 

那会一)断火不超过1个请求,除非你等待按键之间超过2秒,和b)将取消任何未处理的请求,如果你之前在5个字符回落超时到期。作为奖励,它不会造成一大堆匿名函数。