防止回调函数在输入停止之前执行

3

一个计时器用于在未按键时触发AJAX调用。如果按下键,则中止上一个计时器并添加新计时器。这就是我想做但未能成功的内容。以下是我的代码:

 var t;
 input.onkeyup = function(){
    $('.confirmText').html('Checking...');
    var timeStampObj = new Date()
    var timeStamp = timeStampObj.getTime();
    var oldTimeStamp = $(this).attr('timeStamp');//I store a timeStamp in the element
    if(timeStamp < 500 + oldTimeStamp){
        $(this).attr('timeStamp', timeStamp);
        clearTimeout(t);
    }
    t = setTimeout(function(){
        $.ajax({
            url: 'serverScripts/settings/checkEmailAvailability.php',
            data: 'email='+email,
            success: function(text){

           if(text == 'available'){
                $('.confirmText').html('Available!');
           }else{
                $('.confirmText').html('Occupied!');
               }
            }
        });
    }, 500);//Half a second
    $(this).attr('timeStamp', timeStamp);
}

好的,只是一个小错误,电子邮件没有被定义。 - einstein
2个回答

5

看起来你需要一个去抖动器。这个术语源自电子学。它是一种防止在某个时间阈值内多次触发事件的方法。你可以使用以下函数创建一个新函数,只有在上一个事件触发后经过一定的时间后才会被调用。

function debounce(callback, timeout, _this) {
    var timer;
    return function(e) {
        var _that = this;
        if (timer)
            clearTimeout(timer);
        timer = setTimeout(function() { 
            callback.call(_this || _that, e);
        }, timeout);
    }
}

// requires jQuery
$("div").click(debounce(function() {
    console.log("tset");
}, 2000));
debounce所传递的回调函数只有在点击事件停止触发时才会执行。
优秀的Underscore.js库中包含一个等效的函数,此外还有至少两个jQuery插件:

0
你在JavaScript中的哪里定义email变量?
你需要定义email,然后检查你的脚本是否正常工作。
var email = $(this).value; // Pseudo-code - are you using jQuery?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接