ASP.NET ボタン二度押し抑制方法とは?

このQ&Aのポイント
  • ASP.NETでボタンの二度押しを抑制する方法について教えてください。
  • VisualWebDebeloper2010(VB)を使用してWEBサイトを構築しています。ボタンをクリックすると、処理中はボタンを無効化したいと考えています。いろいろなサイトを参考にして調べていたのですが、その中で疑問が出てきました。
  • 最初はJQUERYを使用してボタンをクリックしたらボタンを無効化する方法を試しましたが、ポストバックに反映されない問題がありました。次にUpDataPanelを使用してボタンを無効化する方法を試してみたところ、うまく機能しました。なぜ二つ目の方法だと正常に動作するのかがわかりません。理由を教えてください。
回答を見る
  • ベストアンサー

ASP.NET ボタン二度押し抑制時の方法について

ご教授下さい。 VisualWebDebeloper2010(VB)を使用してWEBサイトを構築しています。 ボタンをクリックすると、処理中はボタンを無効化したいと考えています。 いろいろなサイトを参考にして調べていたのですが、その中で疑問が出てきました。 最初は単純に、UpdataPanel等は使用せず、JQUERYにて、 --------------------------------------- $(function () { $('#btn').click(function () { $('#btn').attr('disabled', 'disabled'); $('#form1').submit(); }); }); ---------------------------------------- とし、ボタンがクリックされたら、ボタンを無効にする。 としていましたが、これは無効になったコントロールはポストバックに反映されないという理由から、 うまく機能しない事がわかりました。 次の方法として、UpDataPanelを使用して下記のコードで試してみると、うまいこと機能しました。 (あるサイトからの丸写しなので、一部問題がありますが…) --------------------------------------------------------- $(function () { var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_initializeRequest( function(sender, args) { args.get_postBackElement().disabled = true; }); }); --------------------------------------------------------- 最初の方法にせよ、次の方法にしても結局はボタンを無効化して、 対応している様に思えるのですが、なぜ二つ目の方法だと、 正常に動作するのかがわかりません。 ここらへんの理由をご教授頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.1

ちゃんと確認したわけじゃないですが、プログラムの字面から。 たんに順番の問題じゃないでしょうか。 最初の方法はボタンを無効化してからサブミットを実行してるので、無効になったボタンの情報がサーバー側にあがっていかない、でいいですよね。 後のほうはinitializeRequestという名称からみて、サブミットの実行によりサーバーへのリクエストをあげようと準備している段階でボタンを無効化している、つまりすでにサーバーにあげるボタンの情報とか準備が終わったあとでボタンの無効化が実行されている、のではないかと思います。 詳しくはPageRequestManagerのドキュメント見ればわかるかな。 って、参照URLみると、beginRequestあたりを使うほうがいいような気がしないでもない。。。

参考URL:
http://msdn.microsoft.com/ja-jp/library/bb311028.aspx
henzoumon
質問者

お礼

ご回答ありがとう御座います。 最初の方法に関してはOKです。恐らくそういった理由だと思います。 initializeRequestの方は「非同期ポストバックの処理が開始され、ポストバック要求がサーバーへ送信される前に発生します。」 とありますので、「非同期ポストバックの処理が開始」とやらが、ポストする情報等の準備が出来ており、この段階でボタンを無効にしても、ポストされる。という風に考える事にします。 ふむ、WEB系の開発は難しいですね。 有難う御座いました!

関連するQ&A

  • as3でボタンにリンクをはる方法!

    質問ばかりで申し訳ないですが、お世話になります。 flashCS4&Actionscript3を使っているものです。 「ボタンにリンクをはる方法を探しています。 (どうしても 1093のシンタックスエラーになってしまい、困っています。)」 現在作成しているものは、以下のような構造です。 ************************************************************* ステージ ↓ムービークリップ【インスタンス名(menu_mc)】 ________________________________________ ・ボタン【インスタンス名(btn1_btn)】 ・ボタン【インスタンス名(btn2_btn)】 ・ボタン【インスタンス名(btn3_btn)】 ________________________________________ *************************************************** menu_mcの中で、以下のように記述しました。 btn1_btn.addEventListener(MouseEvent.CLICK,gotowebpage1); function gotowebpage1(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn2_btn.addEventListener(MouseEvent.CLICK,gotowebpage2); function gotowebpage2(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn3_btn.addEventListener(MouseEvent.CLICK,gotowebpage3); function gotowebpage3(event : MouseEvent) :void { navigateToURL(new URLRequest("http://www.yahoo.co.jp")); } すると、1093のシンタックスエラーになってしまいます。 うまく動作させる為には、他にどんな作業を行ったらいいのでしょうか、 よろしくお願いします!!!

    • ベストアンサー
    • Flash
  • 2度押し防止のJavascript

    先日、「買い」のボタンを押すと、100購入~800購入までがずらりと出てくるJavascriptをこちらでお教えいただきました。(ONEONE様 有難うございます) その際、「買いのボタン」の2度押し防止スクリプトも同時に組んでいただきました。 それが末尾のスクリプトになります。 質問 買いボタンの2度押し防止は出来ていますが、100購入 200購入 300購入の連続買いができてしまう状況です。 この連続買いの防止のjavascriptをご教示いただければと思います。 当方は、 <script type="text/javascript"> jQuery(function($){ $("#btn0").click(function (e) { e.preventDefault(); $("#kai").show(); $(this).prop("disabled", true); }); $("#b_btn").click(function (e) { $(this).prop("disabled", true); }); }); </script> としてみたのですが、うまく行きませんでした。よろしくお願いいたします。 *************************************************************************** 現状 (買いボタンの2度押し防止は機能しているが     100購入 200購入の連続買いができる状態) *************************************************************************** <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <form action="abc.cgi" method="post" name="form1" id="form1"> <button id="btn0">買い</button> <div id="kai" style="display:none"> <button id="b_btn" type="submit" name="b100" value="100">100購入</button><br> <button id="b_btn" type="submit" name="b200" value="200">200購入</button><br> <button id="b_btn" type="submit" name="b300" value="300">300購入</button><br> <button id="b_btn" type="submit" name="b400" value="400">400購入</button><br> <button id="b_btn" type="submit" name="b500" value="500">500購入</button><br> <button id="b_btn" type="submit" name="b600" value="600">600購入</button><br> <button id="b_btn" type="submit" name="b700" value="700">700購入</button><br> <button id="b_btn" type="submit" name="b800" value="800">800購入</button><br> </div> </form> <BR> <script type="text/javascript"> jQuery(function($){ $("#btn0").click(function (e) { e.preventDefault(); $("#kai").show(); $(this).prop("disabled", true); }); }); </script> ***********************************************************************

  • 押したボタンをdisabledにしたい。

    ボタンを押したときに、 ボタンの表示を 灰色表示(disabled)に切り替えて、 押せないようにするには、 どうすればいいんでしょうか? ちなみにボタンはテーブルの中に入っています。 かなり省略したサンプルですが、 下に書き出しました。 <head> <script language="javascript"> <!-- function haiiro(){ alert("今、いま!ボタンをdisabled にできるといいな。"); } --> </script> </head> <body> <table> <tr> <td> <form name="frm"> <input name="btn" type="button" value="ボタン" onclick="haiiro();"> </form> </td> </tr> </table> </body>

  • AS3 記述方法

    ボタンが複数存在し、それぞれのボタンの処理をまとめたい時に どうするか考えています。 たとえばステージに3つのボタンインスタンス 「btn1」「btn2」「btn3」があるとします。 クリックすると、それぞれに応じた値を得るために ------------------------------------------------------------- btn1.addEventListener(MouseEvent.CLICK,syori1); function syori1(eventObject:MouseEvent):void{ trace("あんぱん"); } btn2.addEventListener(MouseEvent.CLICK,syori2); function syori2(eventObject:MouseEvent):void{ trace("しょくぱん"); } btn3.addEventListener(MouseEvent.CLICK,syori3); function syori3(eventObject:MouseEvent):void{ trace("カレーぱん"); } ------------------------------------------------------------- としているのですが、 たとえばもしこれが100個のボタンがあれば 100回同じような事を記述しないといけないので あまりよろしくないな・・・と思い、 ------------------------------------------------------------- for(var i=1; i<=3 i++){ this["btn"+i].addEventListener(MouseEvent.CLICK,syori); } function syori(eventObject:MouseEvent):void{ trace("ジャム"); } ------------------------------------------------------------- としたのですが、これではどのボタンをクリックしても"ジャム"がトレースされます。(当然ですが・・・) このような時、まとめて記述するにはどうすればよいでしょうか?

  • ボタンを押すとデータ表示、再度押すと非表示

    ボタンを押すとデータが表示されるjqueryを利用したjavascriptがあります。 このボタンを再度クリックすると非表示にしたいと考えています。 奇数回クリック=表示 偶数回クリック=非表示 という形です。 ご教授いただきたくお願いいたします。 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script type="text/javascript"> jQuery(function($){ $("#btn0").click(function (e) { e.preventDefault(); $("#data").show(); }); </script> <button class="button18" id="btn0">ボタン</button> <div id="data" style="display:none"> データ </div>

  • 「ボタンロールオーバー時のインスタンス同士の重なり」による動作について

    「ボタンロールオーバー時のインスタンス同士の重なり」による動作について flashcs4、as3で制作をしています。 配置してあるボタンインスタンスにマウスオーバーしたときに、 ボタンの上に吹き出しが表示されるというものをつくろうとしています。 現在記述しているスクリプトは まず、stageにhukidasiをaddChildして表示リストに追加。visibleをfalseにしておく。 btn1にマウスがロールオーバーしたときにhukidasiのvisibleをtrueにして表示。ロールアウトしたときはvisibleをfalseにして非表示にする。 というものです。 こちらの反応はいちおう実現できたのですが、ロールオーバー時にボタン(btn1)と吹き出し(hukidasi)が重なっている部分にマウスをもっていくと、吹き出しが点滅して消えたり表示されたりを繰り返してしまうのです。 サンプル http://homepage2.nifty.com/meary/testtest.html それを解消させるために、吹き出し(hukidasi)はボタン(btn1)の子としてaddChildして、 btn1.mouseChildren=falseとして吹き出しにボタンの機能を持たせないようにしてみると前述のような反応はなくなりました。 ですが、このように吹き出しをボタンの子とすると、ボタンの領域に吹き出しの大きさも追加されてしまいまして、そのようなことは望んでいないのです。 ボタンの領域をマウスが外れたら吹き出しが消える、というようにしたいのです。 このようなことを実現するにはどういったスクリプトが必要でしょうか。 ご教授お願いいたします。 現在記述しているスクリプト -------------------------------------------- //吹き出しインスタンスを生成 var hukidasi:Hukidasi=new Hukidasi(); hukidasi.x=90; hukidasi.y=80; //吹き出しを表示リストに追加 stage.addChild(hukidasi); hukidasi.visible=false; btn1.addEventListener(MouseEvent.ROLL_OVER,btn1_handleRollOver); btn1.addEventListener(MouseEvent.ROLL_OUT,btn1_handleRollOut); //btn1のロールオーバー、アウト時のメソッド function btn1_handleRollOver(event:MouseEvent){ hukidasi.visible=true; } function btn1_handleRollOut(event:MouseEvent){ hukidasi.visible=false; } --------------------------------------------

    • ベストアンサー
    • Flash
  • 2度押し防止ボタン

    HTML5 + CSS3 でスマートフォンゲームを作っています。 回線が混雑している状況でボタンを2度押ししても1回しかカウントされないボタンを作りたいと考えています。 【基本的な知見】 下記であれば要望に沿ったボタンになります。(ボタンはCSS3の標準ボタンを使用) <form action="form.cgi" method="post"> <input type="hidden" name="point" value="1" /> <SCRIPT TYPE="text/javascript"> <!-- //submitの2度押し防止 function disableButton(){ document.form1.button1.disabled = true; submitForm(); } function submitForm(){ document.form1.submit(); } // --> </SCRIPT> <input type="button" value="購 入" onClick="disableButton()" name="button1"> </form> 【やりたいこと】 「ボタンに数量を表示したいことと、ボタン上の数値表記とCGIに渡すvalueが異なることがある」ため、CSS3の標準ボタンを止め下記のオリジナルCSSのボタンを使用します。 <button class="button8" type="submit" name="point" value="1050" onClick="disableButton()"><div>50ポイント</div></button> このオリジナルCSSのボタンを使用した場合の2度押し防止のjavascriptはどのように改造すればいいか教えてください。 上記に示したjavascriptの 「document.form1.button1.disabled = true;」のbutton1をpointに変更したところ、数値をCGIに渡せませんでした。 よろしくお願いいたします。

  • ボタンとASが1フレーム目にないとエラーになるのは仕様ですか?

    CS4、AS3.0で作成しております。 クリックすると指定したシーンへ移動するスクリプトを作成しました。 ボタンが複数あるので、各ボタンにインスタンス名を入れてます。 //各ボタンが押されるのを監視 this.menu_btn.addEventListener(MouseEvent.CLICK,menu); this.shop_btn.addEventListener(MouseEvent.CLICK,shop); this.access_btn.addEventListener(MouseEvent.CLICK,access); //クリックされたとき、指定フレームまで移動 function menu(e:MouseEvent):void { this.gotoAndPlay(69); } function shop(e:MouseEvent):void { this.gotoAndPlay(75); } function access(e:MouseEvent):void { this.gotoAndPlay(78); } で、ボタンとASを1フレーム目に入れれば作動するのですが、両方とも2フレーム以降に持ってくるとエラーが出て作動しません。 「TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」と出ます。 ボタンの数を1つにしても同様でした。 プログレスバーを作るのに、2フレーム目に持ってきたいのですが、これはCS4の仕様かバグなのでしょうか? 回避する方法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Flash
  • PC、携帯の両環境で有効なボタンの二度押し防止機能

    自サイトのCGIにて、フォームのボタンに二度押し防止機能を付けたいのですが、 まず当初 <input type="submit" value="$def_ok"> としていたものを <input type="button" value="$def_ok" onClick="this.disabled=true; this.value='$def_ok'; this.form.submit();"> としました。 これでPCブラウザからの動作に問題は無いようなのですが、一部の携帯電話からのアクセスでボタンが機能しないという報告が多数寄せられまして(javascriptが機能していないため?) 対策として <input type="submit" value="$def_ok" onClick="this.disabled=true; this.value='$def_ok'; this.form.submit();"> としました。(type=buttonを再度submitに変更) submitが二回で二重送信になりそうな気がしましたが… this.disabled=true;で最初のsubmitは無効になっていそうだから大丈夫かな、と思ったのですが、 どうもやはりたまに二重送信が起こってしまっているようなのです。 100%ではなく、数十回に一回程度の割合で起こるようですがよく原因がわかりません。 かと言って <input type="submit" value="$def_ok" onClick="this.disabled=true; this.value='$def_ok';"> とするとやはりPCブラウザからは無効になってしまうようで、ほとほと困り果ててしまいました。 CGIの性質上、二度押し防止機能自体は是非欲しいのですが… 何か上手い方法はありませんでしょうか?

  • ボタンを押して

    下記のように記述して、ボタンを押すとフレーム2に飛ぶようにしました。 ____________________________________________________________________________________________________________________________ btn02_mc.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndPlayFromFrame_2); function fl_ClickToGoToAndPlayFromFrame_2(event:MouseEvent):void { gotoAndPlay(2); } ____________________________________________________________________________________________________________________________ しかし、もう一度同じボタンを押すと、フレーム2が開始されずにフレーム1が開始されます。 フレーム1になり、フレーム1中に再度、このボタンを押すとフレーム2が開始されます。 私がやりたいのは、このボタンを何度押してもこのボタンを押した際には、フレーム2が開始されるようにしたいです。 よろしくお願いします。

専門家に質問してみよう