Подтвердить что ты не робот

Самый простой способ отключить кнопку при отправке формы?

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

Вот моя форма

<form method="POST">
    <input type="text" name="q"/>
    <button class="once-only">Send</button>
</form>

Вот моя первая попытка отключить двойную передачу:

$(document).ready(function(){
    $(".once-only").click(function(){
        this.disabled = true;
        return true;
    });
});

Этот подход предлагается здесь: Отключить кнопку после публикации, используя JS/Jquery. Этот пост предполагает, что отправляющий элемент должен быть вводом, а не кнопкой, но тестирование обоих не имеет значения. Вы можете попробовать это самостоятельно, используя эту скрипку: http://jsfiddle.net/uT3hP/

Как видите, это отключает кнопку, но также предотвращает отправку формы. В случаях, когда подающий элемент является кнопкой и элементом ввода.

Вопрос 1: почему этот обработчик кликов останавливает отправку формы?

Обыскав еще немного, я нахожу это решение (почему я не публикую форму, когда я отключаю кнопку отправки, чтобы предотвратить двойной щелчок?)

if($.data(this, 'clicked')){
    return false;
} else{
    $.data(this, 'clicked', true);
    return true;
}

Вы можете играть с этим, используя эту скрипку: http://jsfiddle.net/uT3hP/1/

Это работает, но...

Вопрос 2: это лучшее, что мы можем сделать?

Я думал, что это будет элементарная вещь. Подход 1 не работает, подход 2 работает, но мне это не нравится, и я чувствую, что должен быть более простой способ.

4b9b3361

Ответ 1

Вы можете использовать jQuery submit(). В этом случае он должен выглядеть примерно так:

$('form').submit(function(){
    $(this).children('input[type=submit]').prop('disabled', true);
});

Вот рабочий jsFiddle (сделанный Майком) - http://jsfiddle.net/gKFLG/1/.

Если ваша кнопка отправки не является прямым дочерним элементом элемента формы, вам необходимо заменить children на find. Кроме того, ваша кнопка отправки также может быть элементом button вместо элемента input. Например. Это так, если вы используете горизонтальные формы Bootstrap. Ниже приведена другая версия фрагмента:

$('form').submit(function(){
    $(this).find('button[type=submit]').prop('disabled', true);
});

Демо jsFiddle - http://jsfiddle.net/devillers/fr7gmbcy/

Ответ 2

Простое и эффективное решение

<form ... onsubmit="myButton.disabled = true; return true;">
    ...
    <input type="submit" name="myButton" value="Submit">
</form>

Источник: здесь

Ответ 3

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

    $('form').submit(function () {
        var button = $('#button');
        var oldValue = button.value;
        var isDisabled = true;

        button.attr('disabled', isDisabled);

        setTimeout(function () {
            button.value = oldValue;
            button.attr('disabled', !isDisabled);
        }, 3000)
    });

Ответ 4

Вы можете попробовать использовать следующий код:

$(document).ready(function(){
   $(".once-only").click(function(){
      this.submit();
      this.disabled = true;
      return true;
   });
});

Ответ 5

Это должно помочь:

<form class="form-once-only" method="POST">
    <input type="text" name="q"/>
    <button type="submit" class="once-only">Send</button>
</form>

JavaScript:

$(document).ready(function(){
    $("form.form-once-only").submit(function () {
        $(this).find(':button').prop('disabled', true);
    });
}

Ответ 6

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

$("input[type='submit']").click(function() {
    $(this).addClass('disabled');
});