Как отключить кнопку отправки после нажатия?

У меня есть кнопка отправки в конце формы.

Я добавил к кнопке отправки следующее условие:

onClick="this.disabled=true;
this.value='Sending…';
this.form.submit();"

Но когда он переходит на следующую страницу, параметры не передаются и передаются нулевые значения.


person maas    schedule 29.07.2010    source источник
comment
Вероятно, это не вина тех звонков, которые вы показываете. Пожалуйста, покажите полный HTML-код формы.   -  person Pekka    schedule 30.07.2010
comment
Не используйте событие onclick кнопки отправки - используйте событие onsubmit формы. Иначе вы не поймаете сообщение с клавиатуры.   -  person Nick    schedule 30.07.2010


Ответы (17)


Возможно, вы отправляете форму дважды. Удалите this.form.submit() или добавьте return false в конце.

у вас должно получиться onClick="this.disabled=true; this.value='Sending…';"

person migajek    schedule 29.07.2010
comment
Однако будьте осторожны, поскольку это не работает в IE8 и Chrome ... хорошо, это работает в том смысле, что он выполняет то, что говорит сценарий, но следствием этого является то, что он также отключает отправку формы. - person Shawn de Wet; 08.03.2013
comment
См. Ответ @andreaskoberle - person Shawn de Wet; 21.01.2016
comment
для тегов button type=submit замените this.value на this.innerText - person Edgar Ortega; 18.12.2018
comment
@Andreas Köberle, ответ ниже, лучше, особенно при использовании любой из фреймворков ASP.NET. - person Kevin Finck; 07.10.2020

Вы должны сначала отправить форму, а затем изменить значение отправки:

onClick="this.form.submit(); this.disabled=true; this.value='Sending…'; "
person Andreas Köberle    schedule 29.07.2010
comment
Это лучший ответ. Некоторые браузеры не знают, что нужно отправлять форму заранее, и это решение помогает обойти это. - person Nathanael; 12.08.2014
comment
onclick должен быть в нижнем регистре - person MadMaardigan; 05.02.2015
comment
Не будет работать должным образом, если сначала будет запущена проверка HTML5. - person cyrotello; 05.10.2017
comment
Для меня 'this.disabled = true' предотвращает запуск функции серверной части, даже если она появляется после отправки! Чтобы обойти это, я реализовал логическое значение и оператор if для проверки первого или последующих щелчков и вернул false для последующих. - person Radderz; 13.10.2017
comment
Работая с панелью обновления ASP.NET, я отключил поведение отправки. 'OnClick = btnSave_Click OnClientClick = this.disabled = true; this.value = 'Сохранение ... Подождите.'; UseSubmitBehavior = false ' - person Muhammad Ali; 10.11.2017
comment
не уважает атрибут formaction - person Vladislav Kostenko; 09.06.2018
comment
в обработчике javascript вместо this будет event.currentTarget. - person phil294; 16.08.2019
comment
У меня это не работает. Значения формы не отправляются. - person Altimus Prime; 28.09.2020

протестировано на IE11, FF53, GC58:

onclick="var e=this;setTimeout(function(){e.disabled=true;},0);return true;"
person Community    schedule 14.06.2017
comment
Это следует принять; другие не отправляют форму - person Damien Romito; 24.07.2019
comment
У меня это отлично сработало, я много пробовал, у меня не получилось, но это сработало. Спасибо - person The Scientific Method; 02.08.2019
comment
Это отлично работает, но как мне изменить значение при нажатии? - person robert0; 13.07.2021

Вам необходимо отключить кнопку в событии onsubmit <form>:

<form action='/' method='POST' onsubmit='disableButton()'>
    <input name='txt' type='text' required />
    <button id='btn' type='submit'>Post</button>
</form>

<script>
    function disableButton() {
        var btn = document.getElementById('btn');
        btn.disabled = true;
        btn.innerText = 'Posting...'
    }
</script>

Примечание: таким образом, если у вас есть элемент формы с атрибутом required, будет работать.

person A-Sharabiani    schedule 07.11.2018

Отключенные элементы HTML-форм не отправляются вместе со значениями post / get при отправке формы. Поэтому, если вы отключите кнопку отправки после нажатия и у этой кнопки отправки установлен атрибут name, он не будет отправлен в значениях post / get, поскольку элемент теперь отключен. Это нормальное поведение.

Один способ решить эту проблему - использовать скрытые элементы формы.

person AlexV    schedule 29.07.2010

трюк заключается в том, чтобы отложить отключение кнопки и отправить форму, которую вы можете использовать window.setTimeout('this.disabled=true',0); да, даже с 0 MS работает

person Frenchi In LA    schedule 29.07.2010
comment
но что, если пользователь нажимает кнопку за этот промежуток времени? - person jospratik; 26.09.2013

Используя JQuery, вы можете сделать это ..

$("#submitbutton").click(
   function() {
      alert("Sending...");
      window.location.replace("path to url");
   }
);
person Manie    schedule 30.07.2010
comment
Пожалуйста, не используйте для этого alerts, они блокируют страницу до тех пор, пока не будут нажаты - person Edgar Ortega; 18.12.2018

Если вы отключите кнопку, ее пара name = value действительно не будет отправлена ​​в качестве параметра. Но остаток параметров должен быть отправлен (если их соответствующие элементы ввода и родительская форма не отключены). Вероятно, вы тестируете только кнопку или другие поля ввода или даже форму отключены?

person BalusC    schedule 29.07.2010

Вот пример, который расширяет решение Андреаса Кёберле. Он использует jQuery для обработчика событий и события готовности документа, но их можно переключить на простой JS:

(function(document, $) {

  $(function() {
    $(document).on('click', '[disable-on-click], .disable-on-click', function() {
      var disableText = this.getAttribute("data-disable-text") || 'Processing...';

      if(this.form) {
        this.form.submit();
      }

      this.disabled = true;

      if(this.tagName === 'BUTTON') {
        this.innerHTML = disableText;
      } else if(this.tagName === 'INPUT') {
        this.value = disableText;
      }
    });
  });

})(document, jQuery);

Затем его можно использовать в HTML следующим образом:

<button disable-on-click data-disable-text="Saving...">Click Me</button>
<button class="disable-on-click">Click Me</button>
<input type="submit" disable-on-click value="Click Me" />
person stephen.hanson    schedule 08.09.2016
comment
Мне нравится это решение, потому что оно следует принципу «Не повторяйся» (СУХОЙ). После добавления первого фрагмента вы можете повторно использовать его, просто используя класс. - person Calabacin; 14.04.2020

Я не думаю, что тебе нужно this.form.submit(). Код отключения должен запуститься, затем он пройдет при щелчке, который щелкнет форму.

person Mitch Dempsey    schedule 29.07.2010
comment
Если вы не поместите this.form.submit (), тогда форма не будет отправлена. - person Manish Champaneri; 31.08.2017
comment
Я использую ‹button type = button class = addb btn btn-primary rounded-pill py-2 btn-block type = submit data-voice_sku = '. $ row [voice_sku].' data-voice_name = '. $ row [voice_name].' onclick = this.disabled = true ›Добавить в список воспроизведения ‹/button›, если я обновляю страницу, отключение пропало, как решить эту проблему? - person Gem; 28.09.2019

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

Вы также можете заменить его другой кнопкой.

person Desarrollo Aplicaciones    schedule 24.07.2013

Ваш вопрос сбивает с толку, и вам действительно стоит опубликовать код, но это должно сработать:

onClick="this.disabled=true; this.value='Sending...'; submitForm(); return false;"

Я думаю, что когда вы используете this.form.submit(), он делает то, что происходит естественным образом, когда вы нажимаете кнопку отправки. Если вы хотите отправлять сообщения на той же странице, вам следует изучить возможность использования AJAX в методе submitForm() (см. Выше).

Кроме того, возврат false в конце значения атрибута onClick подавляет запуск события по умолчанию (в данном случае отправка формы).

person TJ Koblentz    schedule 29.07.2010

 
    A better trick, so you don't lose the value of the button is

    function showwait() {
    document.getElementById('WAIT').style['display']='inline';
    document.getElementById('BUTTONS').style['display']='none';
    }
 

обернуть код для отображения в div

id = WAIT style = "display: none"> текст для отображения (конец div)

обернуть код, чтобы скрыть его в div

id = BUTTONS style = "display: inline"> ... кнопки или что угодно, что нужно скрыть с помощью
onclick = "showwait ();" (конец div)

person Mike    schedule 19.10.2013

В моем случае это было необходимо.

Отключить кнопку отправки при отправке формы

Он отлично работает в Internet Explorer и Firefox без него, но не работает в Google Chrome.

Проблема в том, что вы отключаете кнопку до того, как она действительно может вызвать событие отправки.

person Pascal Desjardins    schedule 23.07.2015
comment
Как правило, рекомендуется показывать в ответе соответствующий код, а не просто ссылку. - person Jordan Davis; 23.07.2015

Я думаю, что простой способ отключить кнопку - :data => { disable_with: "Saving.." }. Это отправит форму, а затем отключит кнопку. Также он не отключит кнопку, если у вас есть какие-либо проверки, такие как required = 'required'.

person chaitanya    schedule 08.08.2017
comment
Такое поведение кажется специфичным для Ruby on Rails. - person Edgar Ortega; 18.12.2018

В этом рабочем примере пользователь подтверждает в JavaScript, что он действительно хочет прервать выполнение. Если true, кнопка отключена, чтобы предотвратить двойной щелчок, а затем будет запущен код, за которым обновляется база данных.

<asp:button id="btnAbort" runat="server" OnClick="btnAbort_Click" OnClientClick="if (!abort()) {return false;};" UseSubmitBehavior="false" text="Abort" ></asp:button>

У меня были проблемы, потому что .net может изменить имя кнопки

function abort() {
    if (confirm('<asp:Literal runat="server" Text="Do you want to abort?" />')) {
        var btn = document.getElementById('btnAbort');
        btn.disabled = true;
        btn.innerText = 'Aborting...'
        return true;
    }
    else {
        return false;
    }  
}

Поскольку вы переопределяете OnClick с помощью OnClientClick, даже если ваш метод проверки завершится успешно, код, стоящий за ним, не будет работать. Вот почему вы устанавливаете UseSubmitBehavior на false, чтобы он работал

PS: Вам не нужен OnClick, если ваш код находится на vb.net!

person Pierre-David Sabourin    schedule 06.05.2019

Я сделал свое дело. Когда установлен тайм-аут, он отлично работает и отправляет все значения.

    $(document).ready(function () {
        document.getElementById('btnSendMail').onclick = function () {
            setTimeout(function () {
                document.getElementById('btnSendMail').value = 'Sending…';
                document.getElementById('btnSendMail').disabled = true;
            }, 850);
        }
    });
person Hasan Tuna Oruç    schedule 09.03.2018
comment
люди будут нажимать несколько раз за 850 мс - person cweiske; 23.04.2021