停止重复Ajax提交?

停止重复Ajax提交?,ajax,jquery,Ajax,Jquery,我想知道在使用jquery和ajax时,停止重复提交的最佳方法是什么 我提出了两种可能的方法,但不确定是否只有这两种 在Ajax启动时,禁用所有按钮,直到请求完成。但我看到的两个问题是我使用jquery模型对话框,所以我不知道禁用这些按钮有多容易,因为我不确定它们是否有id。第二,如果请求挂起,用户实际上无法重试,因为所有按钮都已禁用 我现在正在研究一种叫做AjaxQueue的东西,我不知道它是否是我需要的,或者它是如何工作的,因为插件所在的站点显然已经停止维护了 编辑 我想这是我所看到的东西

我想知道在使用jquery和ajax时,停止重复提交的最佳方法是什么

我提出了两种可能的方法,但不确定是否只有这两种

  • 在Ajax启动时,禁用所有按钮,直到请求完成。但我看到的两个问题是我使用jquery模型对话框,所以我不知道禁用这些按钮有多容易,因为我不确定它们是否有id。第二,如果请求挂起,用户实际上无法重试,因为所有按钮都已禁用

  • 我现在正在研究一种叫做AjaxQueue的东西,我不知道它是否是我需要的,或者它是如何工作的,因为插件所在的站点显然已经停止维护了

  • 编辑

    我想这是我所看到的东西的副产品

    我看到这个ajaxManager的唯一问题是,我认为我必须将所有的$.post、$.get和$.ajax更改为它们的类型

    但是如果我需要$.ajax中的一个特殊参数,会发生什么呢?或者我喜欢使用的事实。post和。get

    编辑2

    我认为它可以容纳所有的$.ajax选项。我还在调查。但是,我现在不确定的是,我是否可以对所有使用相同选项的请求使用相同的构造函数

    First you have to construct/configure a new Ajaxmanager
    //create an ajaxmanager named someAjaxProfileName
    var someManagedAjax = $.manageAjax.create('someAjaxProfileName', {
        queue: true, 
        cacheResponse: true
    });
    

    或者我必须每次都进行上述操作吗?

    您可以将活动请求存储在变量中,然后在有响应时清除它

    var request;  // Stores the XMLHTTPRequest object
    
    $('#myButton').click(function() {
        if(!request) {  // Only send the AJAX request if there's no current request 
    
            request = $.ajax({  // Assign the XMLHTTPRequest object to the variable
                url:...,
                ...,
                complete: function() { request = null } // Clear variable after response
            });
    
        }
    });
    
    编辑:

    这样做的一个好处是,您可以使用
    abort()
    取消长时间运行的请求


    当用户单击按钮时设置一个标志如何?只有当AJAX请求成功完成时(在
    complete
    中,在
    success
    error
    回调后调用),您才会清除该标志,并且只有在未设置该标志的情况下,您才会发送AJAX请求

    与AJAX队列相关的是一个插件,名为that is very good。我自己也用过

    var requestSent = false;
    
    jQuery("#buttonID").click(function() {   
       if(!requestSent) {
          requestSent = true;
    
          jQuery.ajax({
             url: "http://example.com",
             ....,
             timeout: timeoutValue,
             complete: function() {
                 ...
                 requestSent = false;
             },
          });
       }
    });
    

    如果您认为您的请求可能挂起,则可以为长时间运行的请求设置超时值(值以毫秒为单位)。如果发生超时,调用
    错误
    回调,然后调用
    完成
    回调。

    使用
    超时
    属性不是更容易吗?或者它没有像我想的那样工作@维文-很好。除非您想在
    setTimeout()
    中使用其他逻辑来决定是否中止,否则可以使用
    timeout
    属性。
    request
    变量是一个与您的答案类似的标志,但是如果需要,还可以提供
    abort()
    功能。
    $.xhrPool = {};
    $.xhrPool['hash'] = []
    $.ajaxSetup({
        beforeSend: function(jqXHR,settings) {
            var hash = settings.url+settings.data
            if ( $.xhrPool['hash'].indexOf(hash) === -1 ){
                jqXHR.url   = settings.url;
                jqXHR.data  = settings.data;
                $.xhrPool['hash'].push(hash);
            }else{
                console.log('Duplicate request cancelled!');
                jqXHR.abort();
            }
        },
        complete: function(jqXHR,settings) {
            var hash = jqXHR.url+jqXHR.data 
                if (index > -1) {
                    $.xhrPool['hash'].splice(index, 1);
                }
            }
        }); 
    
    $.xhrPool = {};
    $.xhrPool['hash'] = []
    $.ajaxSetup({
        beforeSend: function(jqXHR,settings) {
            var hash = settings.url+settings.data
            if ( $.xhrPool['hash'].indexOf(hash) === -1 ){
                jqXHR.url   = settings.url;
                jqXHR.data  = settings.data;
                $.xhrPool['hash'].push(hash);
            }else{
                console.log('Duplicate request cancelled!');
                jqXHR.abort();
            }
        },
        complete: function(jqXHR,settings) {
            var hash = jqXHR.url+jqXHR.data 
                if (index > -1) {
                    $.xhrPool['hash'].splice(index, 1);
                }
            }
        });