0

我正在尝试使用 ajax 调用在服务器端自动保存表单数据。我在任何输入更改后 20 秒开始自动保存。如果正在进行一个自动保存呼叫,我想等待。以下是我正在采取的步骤。我的方法依赖于一个 javascript 全局变量,我担心我可能会遇到某种同步问题。有没有其他更好的方法来做到这一点?

$('input').change(function() {
            if (autoSaveInProgress == false) {
                //call ajax function in 20secodns.
                setTimeout(autoSaveFunction, 20000);
                autoSaveInProgress = true;
            }
        });

收到服务器的响应后,我在 autoSaveFunction 中将 autoSaveInProgress 设置为 false。

4

2 回答 2

0

为避免使用全局范围变量,您可以在经历更改事件的元素上设置属性。我喜欢使用 disabled 属性。

var disabled = $that.attr('disabled');
if (disabled) {
    return false;
}
$(this).attr('disabled', 'disabled');

并重新启用元素,但您必须将元素传递到异步闭包中(参见小提琴):

$that.removeAttr('disabled');

http://jsfiddle.net/EHFZL/

您还可以使您的更改选择器更具体:http: //jsfiddle.net/eHQbh/

于 2013-08-23T14:11:14.950 回答
0

我建议使用 (jQ)xhr-objects 属性,而不是仅仅假设上一个调用在 20 秒后完成:

var saveXhr;

function autoSave(){

    if(saveXhr && saveXhr.readyState < 4){ 
         //previous save not completed
         //do something, perhaps saveXhr.abort() or prolong the timer
    }else{
       saveXhr = $.ajax({ /* your save ajax code */ });
    }
}
于 2013-08-23T14:01:45.317 回答