Отключить кнопку при отправке формы - PullRequest
15 голосов
/ 20 сентября 2008

У меня есть кнопка, которую я хотел бы отключить при отправке формы, чтобы предотвратить многократную отправку пользователем.

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

Как отключить кнопку, когда форма успешно отправляется, а не только когда пользователь нажимает кнопку?

Это форма ASP.NET, поэтому я хотел бы, если это возможно, приятно подключиться к жизненному циклу страницы asp.net ajax.

Ответы [ 16 ]

17 голосов
/ 05 марта 2009

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

Кнопка:

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" OnClientClick="doSubmit(this)" />

Javascript:

<script type="text/javascript"><!--
function doSubmit(btnSubmit) {
    if (typeof(Page_ClientValidate) == 'function' && Page_ClientValidate() == false) { 
        return false;
    }    
    btnSubmit.disabled = 'disabled';
    btnSubmit.value = 'Processing. This may take several minutes...';
    <%= ClientScript.GetPostBackEventReference(btnSubmit, string.Empty) %>;    
}
//-->
</script>
14 голосов
/ 20 сентября 2008

Дайте этому водовороту:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

         // Identify button as a "disabled-when-clicked" button...
         WebHelpers.DisableButtonOnClick( buttonTest, "showPleaseWait" ); 
    }

    protected void buttonTest_Click( object sender, EventArgs e )
    {
        // Emulate a server-side process to demo the disabled button during
        // postback.
        Thread.Sleep( 5000 );
    }
}



using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Text;

public class WebHelpers
{
    //
    // Disable button with no secondary JavaScript function call.
    //
    public static void DisableButtonOnClick( Button ButtonControl )
    {
        DisableButtonOnClick( ButtonControl, string.Empty );    
    }

    //
    // Disable button with a JavaScript function call.
    //
    public static void DisableButtonOnClick( Button ButtonControl, string ClientFunction )
    {   
        StringBuilder sb = new StringBuilder( 128 );

        // If the page has ASP.NET validators on it, this code ensures the
        // page validates before continuing.
        sb.Append( "if ( typeof( Page_ClientValidate ) == 'function' ) { " );
        sb.Append( "if ( ! Page_ClientValidate() ) { return false; } } " );

        // Disable this button.
        sb.Append( "this.disabled = true;" ); 

        // If a secondary JavaScript function has been provided, and if it can be found,
        // call it. Note the name of the JavaScript function to call should be passed without
        // parens.
        if ( ! String.IsNullOrEmpty( ClientFunction ) ) 
        {
            sb.AppendFormat( "if ( typeof( {0} ) == 'function' ) {{ {0}() }};", ClientFunction );  
        }

        // GetPostBackEventReference() obtains a reference to a client-side script function 
        // that causes the server to post back to the page (ie this causes the server-side part 
        // of the "click" to be performed).
        sb.Append( ButtonControl.Page.ClientScript.GetPostBackEventReference( ButtonControl ) + ";" );

        // Add the JavaScript created a code to be executed when the button is clicked.
        ButtonControl.Attributes.Add( "onclick", sb.ToString() );
    }
}
5 голосов
/ 20 сентября 2008

Следующая функция полезна без необходимости в отключающей части, которая, как правило, ненадежна. Просто используйте «return check_submit ();» как часть обработчика onclick кнопок отправки.

Также должно быть скрытое поле для хранения начального значения form_submitted, равного 0;

<input type="hidden" name="form_submitted" value="0">

function check_submit (){
            if (document.Form1.form_submitted.value == 1){
                alert("Don't submit twice. Please wait.");
                return false;
            }
            else{
                document.Form1.form_submitted.value = 1;
                return true;
            }
            return false;
    }
2 голосов
/ 20 сентября 2008

если проверка прошла успешно, отключите кнопку. если нет, то не надо.

function validate(form) {
  // perform validation here
  if (isValid) {
    form.mySubmitButton.disabled = true;
    return true;
  } else {
    return false;
  }
}

<form onsubmit="return validate(this);">...</form>
2 голосов
/ 20 сентября 2008

Отключите кнопку в самом конце вашего обработчика отправки. Если проверка не пройдена, она должна вернуть false до этого.

Тем не менее, подход JavaScript не является чем-то, на что можно положиться, поэтому у вас должно быть что-то, чтобы обнаружить дубликаты и на сервере.

1 голос
/ 20 сентября 2008

Установите видимость на кнопке 'none';


btnSubmit.Attributes("onClick") = document.getElementById('btnName').style.display = 'none';

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

0 голосов
/ 22 мая 2014

Опираясь на ответ @ rp., Я изменил его, чтобы вызвать пользовательскую функцию и либо отправить и отключить в случае успеха, либо "остановить" при ошибке:

public static void DisableButtonOnClick(Button ButtonControl, string ClientFunction)
{
    StringBuilder sb = new StringBuilder(128);

    if (!String.IsNullOrEmpty(ClientFunction))
    {
        sb.AppendFormat("if (typeof({0}) == 'function') {{ if ({0}()) {{ {1}; this.disabled=true; return true; }} else {{ return false; }} }};", ClientFunction, ButtonControl.Page.ClientScript.GetPostBackEventReference(ButtonControl, null));
    }
    else
    {
        sb.Append("return true;");
    }

    ButtonControl.Attributes.Add("onclick", sb.ToString());
}
0 голосов
/ 25 января 2012

Так что простое отключение кнопки через javascript не является кросс-браузерной совместимой опцией. Chrome не будет отправлять форму, если вы просто используете OnClientClick="this.disabled=true;"
Ниже приведено решение, которое я протестировал в Firefox 9, Internet Explorer 9 и Chrome 16:

<script type="text/javascript">
var buttonToDisable;
function disableButton(sender)
{
    buttonToDisable=sender;
    setTimeout('if(Page_IsValid==true)buttonToDisable.disabled=true;', 10);
}
</script>

Затем зарегистрируйте «disableButton» с помощью события click вашей кнопки отправки формы, одним из следующих способов:

<asp:Button runat="server" ID="btnSubmit" Text="Submit" OnClientClick="disableButton(this);" />

Стоит отметить, что это решает проблему отключения кнопки в случае сбоя проверки на стороне клиента. Также не требует обработки на стороне сервера.

0 голосов
/ 02 июля 2009

одно из моих решений выглядит следующим образом:

добавить скрипт в page_load вашего файла aspx

    HtmlGenericControl includeMyJava = new HtmlGenericControl("script");
    includeMyJava.Attributes.Add("type", "text/javascript");
    includeMyJava.InnerHtml = "\nfunction dsbButton(button) {";
    includeMyJava.InnerHtml += "\nPage_ClientValidate();";
    includeMyJava.InnerHtml += "\nif(Page_IsValid)";
    includeMyJava.InnerHtml += "\n{";
    includeMyJava.InnerHtml += "\nbutton.disabled = true;";
    includeMyJava.InnerHtml += "}";
    includeMyJava.InnerHtml += "\n}";
    this.Page.Header.Controls.Add(includeMyJava);

и затем установите параметры кнопки aspx следующим образом:

<asp:Button ID="send" runat="server" UseSubmitBehavior="false" OnClientClick="dsbButton(this);" Text="Send" OnClick="send_Click" />

Обратите внимание, что "onClientClick" помогает отключить кнопку, а "UseSubmitBehaviour" отключает традиционное поведение отправки страницы и позволяет asp.net отображать поведение отправки по сценарию пользователя.

удачи

-Waqas Aslam

0 голосов
/ 05 июня 2009

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

Конечно, вы также должны писать для этого код на стороне сервера, поскольку вы не можете полагаться на проверку, даже если она выполняется из-за отсутствия или конкретной реализации JavaScript. Однако, если вы полагаетесь на сервер, управляющий состоянием кнопки «включено / выключено», то в любом случае у вас нет возможности заблокировать отправку формы пользователем несколько раз. По этой причине у вас должна быть какая-то логика для обнаружения нескольких представлений от одного и того же пользователя за короткий промежуток времени (например, идентичные значения из одного сеанса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...