- ベストアンサー
送信ボタン連打を抑止したいです
確認画面より送信ボタンを連打すると複数回メールを送信してしまいます。 この連打を抑止したいのですがうまくできません。 確認内容をPOSTして画面の内容をテーブルに書き込んで 正常に書き込んだらメール送信にLocationで移動します。 他に良い方法がありましたら教えて頂きたいです。 よろしくお願いします。 【プログラム名】:kakunin.php <? if($_POST){ //確認内容をテーブルに登録する処理 //テーブル登録処理が正常のときメール送信 if(!$err){ $next_url = "send_mail.php"; header("Location: {$next_url}"); } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="content-style-type" content="text/css"> <title>【ボタン連打テスト】</title> <script language="JavaScript"> var fExec = false; function OneTimeAction(form) { if(fExec == true){ return false; } fExec = true; form.test.disabled = true; return false; } </script> </head> <body> <tr><b>【ボタン連打テスト】</b></tr> <br> <hr> <? //エラー表示をする! ?> <table align = "center" cellspacing="0"> <form name="form" action="kakunin.php" method="post" onSubmit="return OneTimeAction(this);"> <tr> <td><b>項目1</b></td> <td> <input type="text" name="item1" size="17" maxlength="10" value = "<? echo $_POST["item1"] ?>" readonly> </td> </tr> <tr> <td><b>項目2</b></td> <td> <input type="text" name="item2" size="17" maxlength="10" value = "<? echo $_POST["item2"] ?>" readonly> </td> </tr> <tr align="center"> <td colspan="2" > <input type="submit" name="test" value="確認"> </td> </tr> <tr align="center"> <td colspan="2" > <input type="button" value="メニューに戻る" onClick="parent.location = 'menue.php'"> </td> </tr> </form> </table> </body> </html>
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>この連打を抑止したいのですがうまくできません。 どううまくいかないのでしょうか? ご提示の方法でもできそうな気がしますが…? ただ、現状だとどちらのケースでも return false になっているので、送信はされないことになります。 また、ボタンをdisabledにしているので、fExec==trueの場合の処理は実際には実行されることがないと思われます。 後は、nameにformなどを指定すると、ブラウザによってはform要素と誤認する場合があるかも。(←未確認) もしも「送信ができない」というだけでしたら、return trueにしてあげれば動作すると思いますが。 ただし、スクリプトで連打をカットしても、ユーザがスクリプトオフにしていれば効果はありません。 いずれにしろ、サーバ側でも「同じメールを受信していないかのチェック」を行う必要があるかと思います。 以下は、一応、ご参考まで。 (レスポンスにタイムラグがないので確認しにくいのですが、多分OKです) <html> <head> <script type="text/javascript"> function OneTimeAction(f) { var e = f.elements['test']; if (e.value == '確認') { e.value = '送信中'; e.disabled = true; return true; } return false; //この処理はされないはず。 } </script> </head> <body> <form name="form1" action="#" method="get" onSubmit="return OneTimeAction(this);"> <input type="text" name="data" value="testdata"> <input type="submit" name="test" value="確認"> </form> </body> </html>
その他の回答 (2)
- dell_OK
- ベストアンサー率13% (766/5720)
<form> の action を "send_mail.php" にして、 ここでは OneTimeAction() を呼ばないようにします。 確認ボタンの type は "submit" ではなく "button" で、 onClick で OneTimeAction() を呼ぶようにします。 OneTimeAction() 内で form.submit() します。 確認内容をテーブルに登録する処理は send_mail.php で行う。 少なくとも連打はされなくなります。
- yambejp
- ベストアンサー率51% (3827/7415)
適当なidを仕込んでおいて、おなじidからのメールを送信しない制御を いれてみては?
補足
ご指導ありがとうございます。 すみません。javascriptはよくわからないので >適当なidを仕込んでおいて、おなじidからのメールを送信しない制御 具体的に教えて頂きたいのですが、よろしくお願いします。
補足
お世話になります。 多少プログラムの構成を変更しないといけないようですね。 現在のプログラム構成のまま対策することは無理でしょうか? すみません。無理なお願いで。