Mr.Tです、こんにちは。
あれれ、とちょっと悩んだので、Memoです。まあ、今更な話なとこもあるんでしょうが、ご勘弁。
ボタンの二重押しを禁止すべく、クライアントサイド側でボタンを使用不可にしたとき、PostBackが発生しないというものだ。
再現コード:
(default.aspx )
<
%@
Page Language=
"VB" AutoEventWireup=
"false" CodeFile=
"Default.aspx.vb" Inherits=
"_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><
html xmlns=
"http://www.w3.org/1999/xhtml" >
<
head runat=
"server">
<
title>Test1</
title>
<
script language=
"javascript">
function ShowThis(own)
{
own.disabled = true;
}
</
script>
</
head>
<
body>
<
form id=
"form1" runat=
"server">
<
div>
<
asp:Label ID=
"caution" runat=
"server"></
asp:Label>
<
asp:button Text=
"Click" id=
"testbutton" runat=
"server" OnClientClick=
"ShowThis(this);"/> </
div>
</
form>
</
body>
(default.aspx.vb)
Partial
Class _Default
Inherits System.Web.UI.Page
Protected Sub HereClick(
ByVal sender
As Object,
ByVal e
As EventArgs)
Handles testbutton.Click
Me.caution.Text =
"Click" End SubEnd Class ボタンの二度押しを禁止する場合を単純に考えた場合、
- Submitボタンをクリックしたのち
- クライアントサイドで、そのボタンのdisabled=true
- PostBackされる
- 再表示されると、特に何もしなければdisable=false
となる予定だった。そう思っていたのだけど、クライアントサイドで、Submitボタンに対してonClickイベント中にボタンを使用不可にすると
その後はPostBackされない。
クライアントサイドのShowThis内のown.disabled=true;がない場合であれば、予想通りの動きになる。
これを回避するためには、次のように、ClientScriptManager.GetPostBackEventReferenceを使う。
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub HereClick(ByVal sender As Object, ByVal e As EventArgs) Handles testbutton.Click
Me.caution.Text = "Click"
End Sub
Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderComplete
Dim cSM As ClientScriptManager = Page.ClientScript
Me.testbutton.Attributes.Item("OnClick") = cSM.GetPostBackEventReference(Me.testbutton, ””).ToString()
End Sub
End Class
これはASP.NET自体の問題というわけではなく、Perlなどを利用したWebアプリであろうが、同様なことが発生する。
つまり、Submitボタンで、disabled = tureとしたとき、Submitイベントが起きなくなるということだ。
例えば、http://www.willmaster.com/possibilities/archives/wmp20040928001.shtml
#この場合は、SubmitではなくButtonを使え、ということになる
あ、ちなみに、色々と調べると参考になるようなものは転がっているはずだが、クライアントサイドのみで解消する方法は
ちょっとみつからなかった。もし、知っている人がいたら、教えてください。