Ajax и предотвращение дважды “отправляют”

Я имею дело с унаследованным приложением, где они используют теги для многих, форма Ajax "отправляет". Если бы мы использовали [вход] кнопки, то мы могли бы просто установить запрещать атрибут [вход] тег. Но на гиперссылках отключают, не часть спецификации и не последовательный перекрестный браузер.

Мы ищем простое решение для блокирования дополнительных щелчков по гиперссылке.

Примечание: мы используем JavaScript с jQuery

7
задан BuddyJoe 6 July 2010 в 19:46
поделиться

4 ответа

Решение womp'а - это очень основательный способ сделать это.

Однако, если вы хотите что-то более простое, я бы, вероятно, реализовал семафор. Просто установите флаг "отправка" и проверьте, установлен ли семафор, когда пользователь нажимает на ссылку. Вы можете сделать это, установив флаг на самом DOM-объекте, или использовать глобальный булев.

$('#link').each(function() {
    this.submitting = false;
}).click(function() {
    if (!this.submitting)
    {
        this.submitting = true;
        var self = this;
        $.ajax({
             success: function() {
                 self.submitting = false;
             },
             error:  function() {
                 self.submitting = false; // make sure they can try again
             }
        });
    }
});

Я, конечно, сократил вызов $.ajax, но, думаю, вы поняли суть.

Edit: Э... на самом деле, забыл самую важную часть. If (!submitting).

6
ответ дан 6 December 2019 в 14:00
поделиться

Мне нравится подпрограмма Бена Наделя для работы с этим .

По сути, вы создаете оболочку вокруг функции jQuery .ajax и можете встраивать все виды вещей, которые происходят для каждого запроса ajax в вашем приложении. Одна из таких вещей - отслеживание запросов.

Вы увидите, что в его методе-оболочке getJSON он принимает необязательный параметр «name» в качестве имени запроса. Это может быть что угодно, это просто ключ для определения источника запроса. В вашем случае он будет предоставляться при каждом нажатии ссылки. Если параметр имени существует, он сохраняет его в коллекции отслеживания.

Если поступает другой вызов с тем же именем запроса, он просто отбрасывается. Как только исходный запрос возвращается, он сбрасывает флаг отслеживания для этого имени запроса.

Этот метод отлично подходит для расширения многих общих функций на все запросы ajax в вашем приложении. Я создал обработчик множественных запросов, который также позволяет вам указывать поведение новых запросов - прерывает ли он какие-либо существующие или просто отбрасывает. Это полезно, когда вы хотите, чтобы последний запрос был обработан, например, для автозаполнения.

3
ответ дан 6 December 2019 в 14:00
поделиться

В обработчике "click" либо верните false, либо предотвратите значение по умолчанию -

$('#target').click(function(e) {
  e.preventDefault();
  alert('Handler for .click() called.');
});

$('#target').click(function(e) {
  alert('Handler for .click() called.');
  return false;
});

Хмм ... разрешить нажатие кнопки только один раз (на протяжении всей жизни страницы), затем, возможно, использовать .data () -

http://api.jquery.com/data/

Или переключить атрибут.

4
ответ дан 6 December 2019 в 14:00
поделиться

Что происходит, когда эта ссылка выполняет запрос ajax? Если это так, вы можете посмотреть на это

http://www.protofunc.com/scripts/jquery/ajaxManager3/ (это не версия 3.05 в репозитории, который вы, возможно, захотите взять).

У этого есть возможность остановить дублирование запросов ajax.

Также вы можете посмотреть

http://jquery.malsup.com/block/

Они нажимают на ссылку, появляется знак загрузки, и они больше не могут нажимать на эту ссылку.

1
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: