• ベストアンサー

Javascriptで二重送信を防止したいが、画像ボタンだとうまくいかない。

Javascriptでフォームの二重送信防止を行いたいのですが、 送信ボタンが画像だとうまく動作しないようです。 下記のサイトを参考に作ってみたのですが、アラートすらもでないようです。 http://www.futomi.com/lecture/javacss/double_block.html 何かよい策がありましたら教えてください。お願いします。 <<ソース>> <script language="javascript"> <!-- // function submitForm() { document.formname.button.disabled = true; submitForm = disableButton; document.formname.submit(); return false; } function disableButton() { alert('処理中です。しばらくお待ち下さい。'); return false; } // --> </script> ~以下省略~ <form method="POST" form name="formname" action="test.cgi"> ----送信ボタンのコード----- <input type="image" src="images/acc_send.gif" name="send" onclick="submitForm()"> </form>

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

参考URLの内容は若干問題ありです。 送信が実行されるのは、送信ボタンのクリックとは限らない(※1)のでformのonsubmitに仕掛けを施した方が万全です。 ※1 フォーム内にtype=textのinputがあれば、そこでEnterキーをタイプしただけで送信されるブラウザも多いです。 最初の送信アクションの後に送信ボタンを使用できなくするとか、 二回以上押されたらalertで注意を促すとか(過剰サービス??)の必要がなくてとにかく二重送信さえ防ぐのであれば単純に次のように書けばいいかと思います。 (送信ボタンの種類とかは問いませんし、ボタンのonclickとかも要りません) <form method="POST" action="test.cgi" onsubmit="this.onsubmit=function(){return false}"> あと、タグを選ぶのに画像をクリックで送信する必要があるのかどうかも重要です。 <input type="image">はサーバサイトクリッカブルマップの為の要素です。(送信した時にクリックされた位置を一緒に送信します) これを使うと※1とは逆に画像クリックでなければ送信されないブラウザもあります。画像クリックが必須でないなら、 <button type="submit"><img ~></button> の方が適しています。 (自動的に画像の周りにボタンっぽい装飾がされますが、これが要らなければスタイルシートでborderやbackgroundを変更する事もできます)

mekapan
質問者

お礼

()だけの問題かなぁと思ったら、確かにIEでも動きました。 ありがとうございます。

mekapan
質問者

補足

すみません、下のコメントは別の人のお礼でした。 <form method="POST" action="test.cgi" onsubmit="this.onsubmit=function(){return false}"> このコードだけでも十分二重送信を防ぐことができました! ありがとうございます。 確かに、、画像クリックするとは限らないですね。 しかし、色々なブラウザに対応しなければならないので、 画像クリックとEnterの両方に対応しないといけない感じですねぇ。

その他の回答 (2)

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.2

こんにちは 試してみたところアラートが出ないのは submitForm = disableButton; で submitForm = disableButton(); と()が抜けているせいだと思います <script language="javascript"> <!-- // function submitForm() { document.formname.send.disabled = true; submitForm = disableButton(); document.formname.submit(); return false; } function disableButton() { alert('処理中です。しばらくお待ち下さい。'); return false; } // --> </script> <form method="POST" form name="formname" action="test.cgi"> <img src="images/acc_send.gif" name="send" onClick="submitForm()" style="cursor:pointer;"> </form> でできませんか?

mekapan
質問者

お礼

()だけの問題かなぁと思ったら、確かにIEでも動きました。 ありがとうございます。

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.1

こんにちは <input type="image">自体で<input type="submit">と同じ効果があるためではないでしょうか? 参考サイトの下のほうにあるように <img src="images/acc_send.gif" name="send" onClick="submitForm()"> としてみては?

mekapan
質問者

お礼

すばやいご回答ありがとうございます。 参考サイトの通りに <img src="images/acc_send.gif" name="send" onClick="submitForm()"> このように書くと、画像がクリックできなくなるんです。 なので、input typeに書き換えたのですよ。 ちなみに、BODYタグ内にスクリプトを書いたら動きました。 しかし、FireFoxではうまくいくのですがIEだけはNGのようです。 IEに対応するためにはどうしたらよいでしょうか。

関連するQ&A

  • javascriptで二重送信防止

    javascriptでの二重送信防止(submitボタンの無効化)ができません。 【HTML】 <form name="fm" method="post" onsubmit="return dclk()"> <input type="submit" name="smt" value="送信" /><br /> </form> 【javascript】 function dclk(){ document.fm.smt.disabled = true; return false; } これだと、サブミットボタンを押すとボタンが無効化され、その後、送信自体が キャンセルさるのですが、これだと送信自体ができないので意味がありません。 これはなんとか意味はわかります。 そこでreturn falseを省くと送信されると同時にサブミットボタンが無効化されるのかな?と思ったら、 今度は送信されるようですが送信されたと同時にボタンが無効化されません。 どうすべきでしょうか? ネットで調べたらいろいろな方法があるようで、上記のHTMLとjavascriptのコードで なんとかならないでしょうか?

  • JAVASCRIPTでINPUT

    HTMLとJAVASCRIPTとJSPを使ってシステム構築をしております。 --------------- <html> <head> <SCRIPT Language="JavaScript"> <!-- function send() { alert("<input type=text name=name2>"); } // --> </SCRIPT> </head> <body> <form onSubmit="send(); return false;"> <input type=text name=name1> <input type=submit> </form> </body> </html> --------------- 上記のコードでやりたいことは、 submitボタンが押されたときにJAVASCRIPTを呼び出し JAVASCRIPT上で文字を入力し次画面へ送信するような機能を作りたいと思っているのですが、本を見てもなかなか載っていません。 もしかしたらJAVASCRIPTだけではできないかもしれません。 JSPまたはPHPで出来る機能でも良いので教えてください。

  • 【JavaScript】二重送信防止

    いつもお世話になっております。 JavaScriptの二重送信防止についてご教授ください。 現在、下記のJavaScriptを組んでいるのですが、うまく二重送信防止が効いていません。 どこか、おかしなコードがありますでしょうか? ちなみに、<html:text>タグ内でonkeypress="JavaScript:toEnter();"を指定…((1))、 <a href>内でonclick="JavaScript:toAdd();"を指定…((2))しているのですが、 テキストボックス内でエンターを押下した時((1))にうまく二重送信防止が効いていません。 宜しくお願い致します。 <script language="JavaScript"> <!-- var flgSubmit = false; function submitCheck() { if ( flgSubmit ) { return false; } else { flgSubmit = true; return true; } } function toEnter(){ if( submitCheck() ) { if(event.keyCode == 13) toAdd(); } } function toAdd() { if( submitCheck() ) { document.AddForm.submit(); } } //--> </script>

  • 2つのjavascriptを組み合わせたい

    フォームメール用の2つのjavascriptがあります。 ●2重送信防止とデータ送信後指定ページへ遷移するjavascript ●テキストボックスが空欄だった時にアラートを表示するjavascript の2つです。 この2つを組み合わせようとしたのですが、うまく動きません。 ご指導いただきたくお願いいたします。 *************************************************** 【●2重送信防止とデータ送信後指定ページへ遷移するjavascript】【動きます】 送信ボタン押下後、2重送信を防止しながら、データ送信後は「location.href = "finish.html"」でfinish.htmlを表示します。 <script type="text/javascript" src="js/jquery.js"></script> <script> jQuery(function($) { $('#form1').submit(function(event) { // HTML送信キャンセル event.preventDefault(); //フォーム要素取得 var $form = $(this); // 送信ボタンを取得 // (後で使う: 二重送信防止) var $button = $form.find('button'); // 送信 $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: $form.serialize() + '&delay=1', timeout: 10000, // 送信前 beforeSend: function(xhr, settings) { // ボタン無効二重送信防止 $button.attr('disabled', true); }, // 応答後 complete: function(xhr, textStatus) { // ボタン有効再送信許可 $button.attr('disabled', false); }, // 通信成功処理 success: function(result, textStatus, xhr) { // 入力値初期化 $form[0].reset(); location.href = "finish.html"; }, // 通信失敗処理 error: function(xhr, textStatus, error) { alert('retry');} }); }); }); </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信A"> </form> *************************************************** 【●テキストボックスが空欄だった時にアラートを表示するjavascript】【動きます】 テキストボックスが空欄だったらアラートを表示します。 <script> function check3() {   var tel3 = document.form1.tel.value;   var fax3 = document.form1.fax.value;   var isValid = true;   if (!tel3) {     alert("電話未入力");     isValid = false;   }   if (!fax3) {     alert("FAX未入力");     isValid = false;   }   if (!isValid) {     return;   }   document.form1.submit(); } </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信B" onclick="check3();"> </form> *************************************************** 【上記の2つを組み合わせてみました。】【動きません】 テキストボックスが空欄だったらアラートを表示しながら2重ボタン排除&finish.htmlに遷移というものです。 【結果】 「問題なく動くjavascript」2つを単純に組み合わせただけなのですが、 finish.htmlに遷移せずinsert.phpが表示されます。ご指導宜しくお願いします。 <script type="text/javascript" src="js/jquery.js"></script> <script> jQuery(function($) { $('#form1').submit(function(event) { event.preventDefault(); var $form = $(this); var $button = $form.find('button'); $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: $form.serialize() + '&delay=1', timeout: 10000, beforeSend: function(xhr, settings) { $button.attr('disabled', true); }, complete: function(xhr, textStatus) { $button.attr('disabled', false); }, success: function(result, textStatus, xhr) { $form[0].reset(); location.href = "finish.html"; }, error: function(xhr, textStatus, error) { alert('retry');} }); }); }); </script> <script> function check3() {   var tel3 = document.form1.tel.value;   var fax3 = document.form1.fax.value;   var isValid = true;   if (!tel3) {     alert("電話未入力");     isValid = false;   }   if (!fax3) {     alert("FAX未入力");     isValid = false;   }   if (!isValid) {     return;   }   document.form1.submit(); } </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信B" onclick="check3();"> </form>

  • 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に渡せませんでした。 よろしくお願いいたします。

  • JavaScript+PHPでのボタンの値について

    お世話になります。現在下記のようなコードです。 #Html側 <script language="JavaScript"><!-- function send1() { document.Form1.submit(); } function send2() { document.Form2.submit(); } // --></script> <form name="Form1" action="tesuto1.php" > 中略 </form> <form name="Form2" action="tesuto2.php" > 中略 </form> <form> <input type="button" name="botan" value="送信" onClick="send1()"> </form> <form> <input type="button" name="botan" value="取消" onClick="send2()"> </form> <form> <input type="button" name="botan" value="確認" onClick="send1()"> </form> #PHP側 tesuto1.php echo "値は".@$_POST["botan"]."です"; という感じで、どのボタンがクリックされたか判別するために、 ボタンの値を取得したいのですが。 よろしくお願いします。

  • 【JavaScript】二重送信防止

    いつもお世話になっております。 前に二重送信防止の事でご質問させていただきましたが、 新たな問題が出てきましたので、再度質問させてください。 現在、JSPで検索画面を作成しています。 検索を実行する際、検索ボタン(リンク形式)にJavaScriptにて 二重送信防止のプログラムを組み込んでいるのですが、 おかしな動きをする時があります。 検索ボタン押下での二重送信防止プログラムを起動させた場合、 真っ白な画面に遷移し、画面左上に"false"と表示される。 プログラムが悪いのでしょうか? 二重送信防止部分のコードを下記しますので、わかる方がいらっしゃいましたら、 ご教授願います。 ちなみに、検索条件入力エリアでエンターを押しても検索が可能なのですが、 エンターで二重送信防止プログラムを起動させた場合は、正常に動作し、 検索結果も返ってきます。 ------------------------------------------------------- // テキストエリアでエンターを押した際に実行 function toEnter(){  toSearch(); } sendFlag = false; function toSearch(){  if( sendFlag ) {   alert( "送信済みです。" );   return false;  } else {   document.SearchForm.submit();   sendFlag = true;   return true;  } } … // 検索実行呼び出し <a href="JavaScript:toSearch();"><img src="Search.png" alt="検索"></a>

  • javascript confirmでFORM送信

    javascript confirmにて「この点数で良ければ送信する」というものを考えています。 この点数部分は変数になる予定であり、javascript内部で生成されます。 まずは、変数ではなく固定値として、javascriptの中にある数値を<form></form>の中に生成することを考えましたがいきなりつまずきました。 「100という数値を送信」するつもりだったのですが、うまく送信することが出来ません。 どこを修正すればいいかご教示いただきたくお願いいたします。 <html> <head> <title>submit</title> </head> <script language="javascript"> <!-- function frmSubmit() { var errFlag=true; if(errFlag==false) { return; } if(confirm("100点です。送信しますか?")) { document.frm.submit(); document.getElementById("plus").value ="100"; } else { } } //--> </script> <body> <form method="post" action="form.cgi" name="frm" target="_self"> <input type="HIDDEN" id="plus" value="" /><br /> <input type="button" value="send" onclick="frmSubmit();"> </form> </body> </html>

  • javascript form送信後の動作

    以下のスクリプトでiframeにデータは送信できているんですが、<input type="text">に入力したテキストが残ってしまいます。どのように記述したらうまくいくでしょうか? <script type="text/javascript"> function send(){ var frm=document.txt_submit; frm.submit(); frm.reset(); } </script> <form name="txt_submit" action="log.cgi" method="post" target="log" autocomplete="off"> <input type="text" name="ctxt" size="20" value=""> <input type="button" value="送信" onclick="return send();"> </form>

  • formのボタンをsubmitしたときにアラート

    javascript で、formのボタンをsubmitしたときに アラートが出るようにしたいと思います。 下記のように作ってみましたが、うまく動きません。 どのようにすれば動くでしょうか? ご教示いただきたくお願いいたします。 <script type="text/javascript"> function(){ $('form1').submit(function(){ $.ajax({ type: 'POST', data: postData, url: 'buy.php', success: function(data){alert("購入できました");} error: function(){alert('購入できませんでした。再度お試しください');} }); return false; }); } </script> <form name="form1" id="form1" method="POST" name="form1" value="form1" action="buy.php"> <input type="hidden" name="id" value="100" /> <input type="hidden" name="name" value="高橋" /> <input type="submit" value="Save"> <form/>

専門家に質問してみよう