如何使用onkeyup延迟ajax请求并在onkeyup时再次启动计数延迟?

例如代码,当用户将数据填充到id="fname"onkeyup)中时

范围id="loading"将显示

然后2秒钟,数据将发布到test.php

这段代码很好用。

但我想这样申请

当用户将数据填充到id="fname"onkeyup)中时

范围id="loading"将显示

在2秒内,用户再次将数据填充到id="fname"onkeyup)中,清除延迟时间并再次开始计数延迟,

然后2秒钟,数据将发布到test.php

我怎样才能做到这一点 ?

<form id="fid">
<input type="text" id="fname" onkeyup="myFunction()">
<span id="loading" style="display: none;">LOADING</span>
<span id="myplace"></span>
</form>

<script>
function myFunction() {
    $('#myplace').hide();
    $("#loading").show();
    setTimeout(function(){
        $.ajax
        (
            {
                url: 'test.php',
                type: 'POST',
                data: $('#fid').serialize(),
                cache: false,
                success: function (data) {
                    $("#loading").hide();
                    $('#myplace').show();
                    $('#myplace').html(data);
                }
            }
        )
    }, 2000);
}
</script>

最佳答案

setTimeout将为您提供唯一的ID。现在,如果用户在“超时时间”内键入,则可以使用此ID取消以前的超时功能。

var timeoutId = setTimeout(function(){},2000);
clearTimeout(timeoutId)


编辑:

使用您的代码,它应该看起来像这样:

<form id="fid">
<input type="text" id="fname" onkeyup="myFunction()">
<span id="loading" style="display: none;">LOADING</span>
<span id="myplace"></span>
</form>

<script>
(function(){
var currentTimeoutId;
function myFunction() {
    $('#myplace').hide();
    $("#loading").show();

    if(currentTimeoutId){
       clearTimeout(currentTimeoutId);
    }

    currentTimeoutId = setTimeout(function(){
        currentTimeoutId = null;
        $.ajax
        (
            {
                url: 'test.php',
                type: 'POST',
                data: $('#fid').serialize(),
                cache: false,
                success: function (data) {
                    $("#loading").hide();
                    $('#myplace').show();
                    $('#myplace').html(data);
                }
            }
        )
    }, 2000);
}
}());
</script>

10-08 16:21