Javascript 更改后的Ajax

Javascript 更改后的Ajax,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在尝试创建一个textarea,在更改时触发ajax请求。 关键是我担心将太多的请求排入服务器队列,因为该请求将把这个文本区域的内容保存在数据库中。 实际上,我的想法是创建一种计时器,在最后一次onchange后几秒钟,启动ajax请求以保存textarea数据。 关键是我不知道这是不是一个好主意,而且,我仍然没有找到一个可以写下来的代码。 我正在使用JQuery。尝试如下,通过将ajax调用延迟几秒钟来减少调用次数,看看用户是否会继续键入 var timeoutId; $('#texta

我正在尝试创建一个textarea,在更改时触发ajax请求。 关键是我担心将太多的请求排入服务器队列,因为该请求将把这个文本区域的内容保存在数据库中。 实际上,我的想法是创建一种计时器,在最后一次onchange后几秒钟,启动ajax请求以保存textarea数据。 关键是我不知道这是不是一个好主意,而且,我仍然没有找到一个可以写下来的代码。
我正在使用JQuery。

尝试如下,通过将ajax调用延迟几秒钟来减少调用次数,看看用户是否会继续键入

var timeoutId; 
$('#textarea').on('change', function() {
  if(timeoutId){ 
    // prevent last timeout from sending the ajax call
    clearTimeout(timeoutId);
    timeoutId = 0;
  }
  timeoutId =setTimeout(submitFormAjax, 200);
   return false;
});
function submitFormAjax() {
    $.ajax({
        type:"POST",
        url:"ajax.php",
        data:$('#textarea').val(),
        success:function(data) {
            $("#result").html(data);
        }
    });
}

尝试如下所示,通过将ajax调用延迟几秒钟来减少调用次数,以查看用户是否将继续键入

var timeoutId; 
$('#textarea').on('change', function() {
  if(timeoutId){ 
    // prevent last timeout from sending the ajax call
    clearTimeout(timeoutId);
    timeoutId = 0;
  }
  timeoutId =setTimeout(submitFormAjax, 200);
   return false;
});
function submitFormAjax() {
    $.ajax({
        type:"POST",
        url:"ajax.php",
        data:$('#textarea').val(),
        success:function(data) {
            $("#result").html(data);
        }
    });
}
玩弄

你可以限制通话,基本的想法是检查是否有计时器

var requestTimer;
$('#textarea').on('change', function() {
   if (requestTimer) window.clearTimeout(requestTimer);  //see if there is a timeout that is active, if there is remove it.
   requestTimer = setTimeout(submitFormAjax, 1000);  //delay before making the call
});
您还可以检查是否存在活动的Ajax请求

var requestTimer;
var xhr;
$('#textarea').on('change', function() {
   if (requestTimer) window.clearTimeout(requestTimer);  //see if there is a timeout that is active, if there is remove it.
   if (xhr) xhr.abort();  //kill active Ajax request
   requestTimer = setTimeout(submitFormAjax, 1000);  //delay before making the call
});


function submitFormAjax() {
    xhr = $.ajax({
        type:"POST",
        url:"ajax.php",
        data:$('#textarea').val(),
        success:function(data) {
            $("#result").html(data);
        }
    });
}
玩弄

你可以限制通话,基本的想法是检查是否有计时器

var requestTimer;
$('#textarea').on('change', function() {
   if (requestTimer) window.clearTimeout(requestTimer);  //see if there is a timeout that is active, if there is remove it.
   requestTimer = setTimeout(submitFormAjax, 1000);  //delay before making the call
});
您还可以检查是否存在活动的Ajax请求

var requestTimer;
var xhr;
$('#textarea').on('change', function() {
   if (requestTimer) window.clearTimeout(requestTimer);  //see if there is a timeout that is active, if there is remove it.
   if (xhr) xhr.abort();  //kill active Ajax request
   requestTimer = setTimeout(submitFormAjax, 1000);  //delay before making the call
});


function submitFormAjax() {
    xhr = $.ajax({
        type:"POST",
        url:"ajax.php",
        data:$('#textarea').val(),
        success:function(data) {
            $("#result").html(data);
        }
    });
}

好主意还是坏主意:完全取决于您、服务器的接近程度、服务器资源和键入文本的用户数:)总之,计时器的代码如下所示:

<textarea id="textarea"></textarea>

var textTimeout = null;
$( "#textarea" ).on( "keyup", function() {
    var $that = $(this);

    cancelTimeout( textTimeout );
    textTimeout = setTimeout( function() {
        $.post("www.example.com", { data: $that.val() }, function() {
            alert( "Posted all text!" );
        });
    }, 2000);
});

var textTimeout=null;
$(“#textarea”)。在(“keyup”,function()上{
var$that=$(this);
取消超时(textTimeout);
textTimeout=setTimeout(函数(){
$.post(“www.example.com”,{data:$that.val()},function()){
警报(“已发布所有文本!”);
});
}, 2000);
});

但是,如果您在jQuery中使用“change”事件,那么它只会在您对文本区域失去关注时发生,因此您不必担心请求排队(是的!)。

好主意或坏主意:完全取决于您,服务器的接近程度、服务器资源和键入文本的用户数:)总之,计时器的代码如下所示:

<textarea id="textarea"></textarea>

var textTimeout = null;
$( "#textarea" ).on( "keyup", function() {
    var $that = $(this);

    cancelTimeout( textTimeout );
    textTimeout = setTimeout( function() {
        $.post("www.example.com", { data: $that.val() }, function() {
            alert( "Posted all text!" );
        });
    }, 2000);
});

var textTimeout=null;
$(“#textarea”)。在(“keyup”,function()上{
var$that=$(this);
取消超时(textTimeout);
textTimeout=setTimeout(函数(){
$.post(“www.example.com”,{data:$that.val()},function()){
警报(“已发布所有文本!”);
});
}, 2000);
});

但是,如果您在jQuery中使用“change”事件,那么它只会在您对文本区域失去焦点时发生,因此您不必担心请求排队(是的!).

使用计时器是一个非常好的主意-查看使用setTimeout和clearTimeout。使用计时器是一个非常好的主意-查看使用setTimeout和clearTimeout。是否有方法在创建新的setTimeout之前“取消”上一个setTimeout?可能需要更长的超时时间超过200ms。。。这大概和正常打字一样快!另外,当按下另一个键时,这不会使用clearTimeout来取消计划的post。在创建新的setTimeout之前,是否有方法“取消”上一个setTimeout?可能需要超过200ms的超时。。。这大概和正常打字一样快!另外,当按下另一个键时,这不会使用clearTimeout来取消预定的post。这实际上就是我要找的。非常感谢你的更新这是我一直在寻找的。谢谢,谢谢你的更新