Disable submit button once it is clicked.

Z

zlf

How to disable button once it is clicked on the page? The codes in click
event of submit button is time-costing(about 4-5 secs), in this period, user
maybe do a re-submit, that is not expected.

Thanks

zlf
 
S

sloan

You can try this code:

MyCompany.Web.Utilities.PageUtilityLib.RegisterGenericJavaScriptBlock is
just a wrapper for registering a client side java script.

MyCompany.Web.Utilities.ObjectUtilityLib.AppendAttribute is just a wrapper
for myControl.Attributes.Add( .......... )


You should get the idea.

This handles 3 types of controls.






private static readonly string HREF_ALREADY_CLICKED_VARIABLE_NAME =
"hrefAlreadyClicked";
private static readonly string
HREF_ALREADY_CLICKED_VARIABLE_NAME_JS_KEY =
"HREF_ALREADY_CLICKED_VARIABLE_NAME_JS_KEY";

/// <summary>
/// Provides the double submit prevention on controls issuing a
PostBack.
/// </summary>
/// <param name="TargetPage">The target page.</param>
/// <param name="c">The control.</param>
public static void DoubleSubmitPrevention(Page TargetPage,
System.Web.UI.WebControls.WebControl c)
{
DoubleSubmitPrevention(TargetPage, c, string.Empty);
}


/// <summary>
/// Doubles the submit prevention.
/// </summary>
/// <param name="TargetPage">The target page.</param>
/// <param name="c">The control which needs double submit
prevention. Button, LinkButton, or ImageButton.</param>
/// <param name="submitImageName">Name of the submit image.</param>
public static void DoubleSubmitPrevention(Page TargetPage,
System.Web.UI.WebControls.WebControl c, string submitImageName)
{
DoubleSubmitPrevention(TargetPage, c, submitImageName, 125);// a
125 milliseconds delay seems to be a good balance
}


/// <summary>
/// Provides the double submit prevention on controls issuing a
PostBack.
/// </summary>
/// <param name="TargetPage">The target page.</param>
/// <param name="c">The control which needs double submit
prevention. Button, LinkButton, or ImageButton.</param>
/// <param name="submitImageName">Name of the alternate image to
show while the PostBack is occuring.</param>
/// <param name="imageDelayMilliseconds">The image delay
milliseconds. Suggested value is around 125.</param>
public static void DoubleSubmitPrevention(Page TargetPage,
System.Web.UI.WebControls.WebControl c, string submitImageName, int
imageDelayMilliseconds)
{

string wcUID = c.ID;


// We need a member variable to track this.......so register it
here
MyCompany.Web.Utilities.PageUtilityLib.RegisterGenericJavaScriptBlock(TargetPage,
"var " + HREF_ALREADY_CLICKED_VARIABLE_NAME + "=false;",
HREF_ALREADY_CLICKED_VARIABLE_NAME_JS_KEY, true);

string pleaseWait = "Please Wait...";

System.Text.StringBuilder sb = new System.Text.StringBuilder();
if (TargetPage.Validators.Count > 0)
{
sb.Append("if (typeof(Page_ClientValidate) == 'function')
{ ");
sb.Append("if (Page_ClientValidate() == false) { return
false; }} ");
}
if ((c is System.Web.UI.WebControls.Button))
{
sb.Append("this.value = '" + pleaseWait + "';");
}
else if ((c is System.Web.UI.WebControls.LinkButton))
{
sb.Append("this.innerHTML = '" + pleaseWait +
"';if(hrefAlreadyClicked==false){" + HREF_ALREADY_CLICKED_VARIABLE_NAME +
"=true;return true;}else{this.innerHTML+='...';return false;};");
}
else if ((c is System.Web.UI.WebControls.ImageButton))
{
MyCompany.Web.Utilities.PageUtilityLib.RegisterGenericJavaScriptBlock(TargetPage,
"var imgSaveButtonAlternate = new Image().src = '" + submitImageName + "'",
"ImagePreLoad", true);
sb.Append("this.src = '" + submitImageName + "';");
sb.Append("setTimeout('" +
TargetPage.ClientScript.GetPostBackEventReference(c , null).Replace("'",
"\\'") + ";', " + imageDelayMilliseconds + ");");
}
else
{
throw new ArgumentException("This procedure only accepts '
System.Web.UI.WebControls.Button', 'System.Web.UI.WebControls.LinkButton' ,
and ' System.Web.UI.WebControls.ImageButton' objects");
}


sb.Append("this.disabled=true;");


if (!((c is System.Web.UI.WebControls.ImageButton)))
{
sb.Append(TargetPage.ClientScript.GetPostBackEventReference(c,
null));
}
sb.Append(";");
MyCompany.Web.Utilities.ObjectUtilityLib.AppendAttribute(c,
"onClick", sb.ToString(), Web.Utilities.AppendOrder.AFTER_CURRENT_ITEMS);
sb = null;
}
 
M

Mark Rae [MVP]

How to disable button once it is clicked on the page? The codes in click
event of submit button is time-costing(about 4-5 secs), in this period,
user maybe do a re-submit, that is not expected.

<asp:Button ID="cmdSubmit" runat="server" Text="Submit"
OnClick="cmdSubmit_Click" OnClientClick="this.disabled=true;" />
 
Z

zlf

Thanks!
I have another question. How to re-enable it once an exception occurs?
Now, if exception occurs, a message box pops up and the button remains
disabled. So I cannot click that button till I refresh that page manually.
 
M

Mark Rae [MVP]

I have another question. How to re-enable it once an exception occurs?
Now, if exception occurs, a message box pops up and the button remains
disabled. So I cannot click that button till I refresh that page manually.

Where does the error occur? What causes the message to pop up?
 
Z

zlf

asp:UpdatePanel pops exceptions up.

I tried the script below, but it fails "Object expected" after 5 secs I
click the button. Can you tell me what is wrong with my script?

SelectAllButton.Attributes["onclick"] =
GetPostBackEventReference(SelectAllButton) +
";getElementById('SelectAllButton').disabled=true;setTimeout(\"getElementById('SelectAllButton').disabled=false\",5000);";

Thanks
 
Z

zlf

I forgot to prefix document before getElementById. It works now after
prefixing document.

SelectAllButton.Attributes["onclick"] =
GetPostBackEventReference(SelectAllButton) +
";getElementById('SelectAllButton').disabled=true;setTimeout(\"document.getElementById('SelectAllButton').disabled=false;\",5000);";

Thanks

zlf

zlf said:
asp:UpdatePanel pops exceptions up.

I tried the script below, but it fails "Object expected" after 5 secs I
click the button. Can you tell me what is wrong with my script?

SelectAllButton.Attributes["onclick"] =
GetPostBackEventReference(SelectAllButton) +

";getElementById('SelectAllButton').disabled=true;setTimeout(\"getElementById('SelectAllButton').disabled=false\",5000);";

Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,796
Latest member
SteveBreed

Latest Threads

Top