何らかの理由で、このコードはページを更新しますが、フィールドは投稿されません...
$('form').submit(function(){
$('input[type=submit]', this).attr('disabled', 'disabled');
});
これをコーディングするより良い方法はありますか?
コードがフォームの送信アクションを変更しています。送信する代わりに、ボタン属性を変更します。
これを試して:
$('input[type=submit]').click(function() {
$(this).attr('disabled', 'disabled');
$(this).parents('form').submit();
});
私はこれを行ういくつかの方法を見てきました:
しかし、期待どおりに動作するものはないようであるため、私は独自の方法を作成しました。
_submit-once
_というフォームにクラスを追加し、次のjQueryを使用します。
_$('form.submit-once').submit(function(e){
if( $(this).hasClass('form-submitted') ){
e.preventDefault();
return;
}
$(this).addClass('form-submitted');
});
_
これにより、フォームに別のクラス_form-submitted
_が追加されます。その後、フォームを再度送信しようとしてこのクラスがある場合、jQueryはフォームが送信されないようにし、_return;
_で関数を終了します。したがって、何も再送信されません。
私のフォームの中には、複数回送信できるAjaxを使用するものがあるため、$('form.submit-once')
の代わりに$('form')
を使用することにしました。
this jsFiddle でテストできます。 _target="_blank"
_をフォームに追加して、フォームの送信を複数回テストできるようにしました。
サイドノート:サーバー側での二重送信も防ぐことで、非JSユーザーを検討することができます。たとえば、最後の送信日時を保存するセッション変数があり、3秒以内のそれ以上の送信は無視します。
問題のコードが機能しない理由はわかりません。同様の簡単なコードスニペットを以下に示します。過度に複雑にしないでください。
$("form").submit(function () {
// prevent duplicate form submissions
$(this).find(":submit").attr('disabled', 'disabled');
});
私にとっての利点:
Chrome 53:
$('input[type=submit]').addClass('submit-once').click(function(e){
if($(this).hasClass('form-submitted') ){
e.preventDefault();
return;
}
$(this).addClass('form-submitted');
});
コードに理由はありません 動作しないはずです 。フォームを送信すると、送信ボタンは無効になります。デモでJSFiddleに送信されるヘッダーを確認し、フォームフィールドが実際に送信されています(IEおよびChrome)でテスト済み):
POST http://fiddle.jshell.net/josh3736/YnnGj/show/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://fiddle.jshell.net/josh3736/YnnGj/show/
Accept-Language: en-US,en;q=0.7,es;q=0.3
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: fiddle.jshell.net
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache
test=It+works
次のステップは次のとおりです。
私のために働いたもの....
$('body').bind('pagecreate', function() {
$("#signin-btn").bind('click', function() {
$(this).button('disable');
showProgress(); // The jquery spinny graphic
$('form').submit();
});
});
ボタンを追加する必要がある場合は、常に<input type='button'>
役立つタグ。送信ボタンを送信したくない場合、最良の方法は送信ボタンを追加しないことです。
画像読み込みアイコンを使用したすべての入力、ボタン、リンクの一般的なソリューションは次のとおりです。
$(function(){
$(document).on('click', 'input[type=submit], button[type=submit], a.submit, button.submit', function() {
// Preserves element width
var w = $(this).outerWidth();
$(this).css('width', w+'px');
// Replaces "input" text with "Wait..."
if ($(this).is('input'))
$(this).val('Wait...');
// Replaces "button" and "a" html with a
// loading image.
else if ($(this).is('button') || $(this).is('a'))
$(this).html('<img style="width: 16px; height: 16px;" src="path/to/loading/image.gif"></img>');
// Disables the element.
$(this).attr('disabled', 'disabled');
// If the element IS NOT a link, submits the
// enclosing form.
if (!$(this).is('a'))
if ($(this).parents('form').length)
$(this).parents('form')[0].submit();
return true;
})
});
リンクの場合、クラス「submit」を追加する必要があります。
コードは問題ありません。私はこの同じ問題に遭遇しましたが、私にとっては、JavaScriptではなくphpに問題がありました。ボタンを無効にすると、フォームと共に送信されなくなり、私のphpは送信ボタンに依存していました
if(isset($_POST['submit'])){
...
}
そのため、ページは更新されますが、phpは実行されません。現在、required
属性を持つ別のフィールドを使用しています。