Остановить дублирование Ajax Submisions?

Мне интересно, как лучше всего прекратить дублирование представлений при использовании jquery и ajax?

Я придумываю 2 возможных способа, но не уверен, что это только 2.

  • В Ajax start отключите все кнопки до завершения запроса. 2 проблемы я вижу с этим, хотя я использую диалог модели jquery, поэтому я не знаю, как легко было бы отключить эту кнопку, поскольку я не уверен, что у них есть идентификаторы. Во-вторых, если запрос зависает, у пользователя действительно нет возможности повторить попытку, так как все кнопки отключены.

  • Я смотрю на то, что называется AjaxQueue, в это время я не знаю, что мне нужно и как он работает с сайта, где плагин, по-видимому, работает для обслуживания.

http://docs.jquery.com/AjaxQueue

Edit

Я думаю, что это отскок от того, что я смотрел.

http://www.protofunc.com/scripts/jquery/ajaxManager/

Единственная проблема, с которой я вижу в этом 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
});

Или мне нужно сделать это выше каждый раз?

Ответ 1

Как установить флажок, когда пользователь нажимает кнопку? Вы удалите флаг только тогда, когда запрос AJAX завершится успешно (в complete, который вызывается после обратных вызовов success и error), и вы будете отправлять запрос AJAX только в том случае, если флаг не установлен.

В связи с очередью AJAX есть плагин под названием jQuery Message Queuing, который очень хорош. Я использовал его сам.

var requestSent = false;

jQuery("#buttonID").click(function() {   
   if(!requestSent) {
      requestSent = true;

      jQuery.ajax({
         url: "http://example.com",
         ....,
         timeout: timeoutValue,
         complete: function() {
             ...
             requestSent = false;
         },
      });
   }
});

Вы можете установить значение тайм-аута для долгосрочных запросов (значение в миллисекундах), если вы считаете, что ваш запрос имеет возможность зависания. Если происходит тайм-аут, вызывается обратный вызов error, после которого вызывается обратный вызов complete.

Ответ 2

Вы можете сохранить активный запрос в переменной, а затем очистить его, когда есть ответ.

var request;  // Stores the XMLHTTPRequest object

$('#myButton').click(function() {
    if(!request) {  // Only send the AJAX request if there no current request 

        request = $.ajax({  // Assign the XMLHTTPRequest object to the variable
            url:...,
            ...,
            complete: function() { request = null } // Clear variable after response
        });

    }
});

EDIT:

Одна хорошая вещь об этом заключается в том, что вы можете отменить длительные запросы с помощью abort().

var request;  // Stores the XMLHTTPRequest object
var timeout;  // Stores timeout reference for long running requests

$('#myButton').click(function() {
    if(!request) {  // Only send the AJAX request if there no current request 

        request = $.ajax({  // Assign the XMLHTTPRequest object to the variable
            url:...,
            ...,
            complete: function() { timeout = request = null } // Clear variables after response
        });

        timeout = setTimeout( function() {
                        if(request) request.abort();  // abort request
                  }, 10000 );                         //   after 10 seconds

    }
});

Ответ 3

$.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);
            }
        }
    });