17

ダブルクリックの送信動作を避ける必要があります。目立たないライブラリでクライアント検証を使用しています。ダブルクリックを回避するための次のコードがあります。

jQuery.fn.preventDoubleSubmit = function () {
         var alreadySubmitted = false;
         return jQuery(this).submit(function () {

             if (alreadySubmitted)
                 return false;
             else {
                 alreadySubmitted = true;
             }
         });
     };

     jQuery('form').preventDoubleSubmit();

残念ながら、フォームに有効なフィールド (必須フィールドなど) が含まれている場合、上記のコードは引き続き実行されるため、フォームの間違いを修正しても、再度送信することはできません。

検証が正常に完了した後、ダブルクリック コードを起動するにはどうすればよいですか?

4

9 に答える 9

22

JQuery One イベントを使用することもできます。

ダブルクリックに対するほとんどのガードは、すばやくダブルクリックすることで回避できることがわかりました。one イベントを使用することは、イベントが 1 回だけ発生することを確認する唯一の真の方法です。この手法は、input type=submit タグを使用して「すぐに」機能するとは思いません。代わりに、単純に input type=button またはJQueryUI の .button()を使用できます。

$("#submitButton").one("click", function(event) {
   $('#theForm').submit();
});

検証エラー (またはその他の状況) でイベントを再配線する必要がある場合は、イベント ハンドラー用の関数を作成することをお勧めします。この例では、イベント ハンドラーがフォームを送信するだけであるため、関数は必要ありませんが、より複雑なシナリオでは、同じことを繰り返さないようにしたい場合があります。

function submitClick(event) {
   $('#theForm').submit();
}

$("#submitButton").one('click', function(event) {
   submitClick(event);
});

// This handler will re-wire the event when the form is invalid.
$('#theForm').submit(function(event) {
   if (!$(this).valid()) {
      event.preventDefault();
      $('#submitButton').one('click', function(event) { submitClick(event); });
   }
});

ボタンが機能しなくなったことをユーザーにフィードバックしたい場合は、ここに無効化コードを追加できます。One イベントを使用することの大きな副作用の 1 つは、実際にボタンを無効にする必要がなく、独自のスタイルを使用できることです。

function submitClick(event) {
   $('#submitButton').addClass('disabledButton');
   $('#theForm').submit();
}

$("#submitButton").one('click', function(event) {
   submitClick(event);
});

// This handler will re-wire the event when the form is invalid.
$('#theForm').submit(function(event) {
   if (!$(this).valid()) {
      event.preventDefault();
      $('#submitButton').one('click', function(event) { submitClick(event); });
      $('#submitButton').removeClass('disabledButton');
   }
});

JQuery One イベント: http://api.jquery.com/one/

于 2011-01-05T23:13:00.443 に答える
8

次のコードで解決しました。

var tryNumber = 0;
 jQuery('input[type=submit]').click(function (event) {
     var self = $(this);

     if (self.closest('form').valid()) {
         if (tryNumber > 0) {
             tryNumber++;
             alert('Your form has been already submited. wait please');
             return false;
         }
         else {
             tryNumber++;
         }
     };
 });

注: 次のものを置き換えることもできます。

return false;

行、次の場合:

self.attr('disabled', true);

ただし、コントローラーの送信ボタンの名前を追加のロジックに使用すると、null として送信されます。(追加の非表示フィールドを使用して、送信する前に課金することができます)

それだけです、それが役立つことを願っています

ロドリゴ

編集:これらの投稿のおかげで: jquery 初心者: 検証を結合し、送信ボタンを非表示にします

于 2010-12-28T19:00:19.670 に答える
5

なぜ使用しないのですか:

function disableButtons() {
    var form = $(this);
    var btns = $("input:submit", form);

    if (!form.valid()) {
        // allow user to correct validation errors and re-submit
        btns.removeAttr("disabled");
    } else {
        btns.attr("disabled", "disabled");
    }
}

ボタンを無効にして有効にするには、次を使用します。

$("form").bind("submit", disableButtons);
于 2011-10-07T15:37:01.283 に答える
3

Ryan P の一般的な回答に基づいて、私の ajax フォームでも動作する次の一般的なソリューションを作成しました。

カスタム送信ボタンを次のクラスで装飾します。

<button type="button" class="one-click-submit-button">Submit</button>

以下を JavaScript ファイルに追加します。

function OneClickSubmitButton() {
    $('.one-click-submit-button').each(function () {
        var $theButton = $(this);
        var $theForm = $theButton.closest('form');

        //hide the button and submit the form
        function tieButtonToForm() {
            $theButton.one('click', function () {
                $theButton.hide();
                $theForm.submit();
            });
        }

        tieButtonToForm();

        // This handler will re-wire the event when the form is invalid.
        $theForm.submit(function (event) {
            if (!$(this).valid()) {
                $theButton.show();
                event.preventDefault();
                tieButtonToForm();
            }
        });
    });
}

OneClickSubmitButton();

これは ajax フォームであるため、サーバーの検証に失敗した場合はハンドラーをリロードします。

function MyForm_OnSuccess() {
    if (true if your form passed validation logic) {
        //do something since your form submitted successfully
    } else { //validation failed on server
        OneClickSubmitButton(); //reinitialize the button logic
    }
}

明らかに、ajax フォームがない場合は、OneClickSubmitButton関数全体を省略して$('.one-click-submit-button').each(...直接実行できます。

于 2012-09-07T21:47:22.120 に答える
2

私はこれに対して別のアプローチを使用します。ボタンのクリック イベントではなく、フォームの送信イベントに配線します。フォームの複数の同時送信を防ぐ魅力のように機能します。

function initFormsToPreventSimultaneousSubmits(selector) {
    if (!selector) {
        selector = 'form'; // No selector supplied, apply to all forms on the page
    }

    // Make sure all forms that conform to selector are marked as not submitting
    $(selector).each(function()
    {
        var $form = $(this);
        $form.data('submitting', false);
    });

    // Attach to submit event of all forms that conform to selector
    $(selector).off('submit').on('submit', function (e) {
        var $form = $(this);

        if (!$form.valid || $form.valid()) { // Make sure to only process when the form is valid or jquery validation is not used
            if ($form.data('submitting')) {
                // form is already submitting. Classic case of double click on one of the submit buttons of the form. Stop the submit
                e.preventDefault();
                return false;
            } else {
                // All ok, mark the form as submitting and let the form perform the submit
                $form.data('submitting', true);
                return true;
            }
        }
    });
}

ドキュメントの準備ができたら、initFormsToPreventSimultaneousSubmits() を呼び出して、ページ上のすべてのフォームを初期化します。

覚えておくべき唯一のことは、Ajax フォーム ポストを使用するときは、AjaxOptions 設定の OnComplete イベントで initFormsToPreventSimultaneousSubmits('#formId') を呼び出すことです。そうしないと、フォームは完了時に送信済みとしてマークされます。「通常の」フォーム ポストを使用する場合、これは問題になりません。

于 2014-07-22T17:49:29.040 に答える
2
 $('form').submit(function () {
 $('input[type="submit"]', this).attr('disabled', 'disabled');
   });
于 2014-05-21T10:57:30.847 に答える
2

MVC3 の控えめな検証を使用するフォームと、[RemoteAttribute] を持つビューモデルがあります。フォームの送信イベントは、すべての検証が通過した後にのみ発生するように見えます。私は現在これを使用していますが、うまくいくようです:

<input type="submit" value="Submit the Form" 
    data-app-disable-on-submit="true" />

$('form').live('submit', function() {
    $(this).find('input[type="submit"][data-app-disable-on-submit="true"]')
                .attr('disabled', 'disabled');
})

;

リモート属性検証アクション メソッドと HttpPost アクション メソッドの両方にブレークポイントを設定しました。初めて送信ボタンをクリックすると、検証アクション メソッドのブレークポイントにヒットします。この時点では、ボタンはまだ有効になっています。複数回クリックでき、検証メソッドを再開した後、HttpPost は 1 回だけヒットします。HttpPost がヒットすると、送信ボタンが無効になります。

アップデート

そうです、あなたはアレックスです。したがって、上記の更新版は次のようになります。

$('form').on('submit', function() {
    $(this).find('input[type="submit"][data-app-disable-on-submit="true"]')
                .attr('disabled', 'disabled');
})
于 2011-10-18T16:03:18.043 に答える
0

アレックスライアン Pによる回答を拡張して、jQuery 検証が欠落している可能性があり、単一のフォームに複数の送信ボタンが存在する状況を説明します。

oneClickSubmitButton = function () {
    $('input[type=submit], button[type=submit], input[type=image]').each(function () {
        var $theButton = $(this);
        var $theForm = $theButton.closest('form');

        //hide the button and submit the form
        function tieButtonToForm() {
            $theButton.one('click', function () {
                $theButton.addClass('ui-state-disabled');
            });
        }

        tieButtonToForm();

        $theForm.submit(function (event) {
            // Only proceed for the clicked button
            if (!$theButton.hasClass("ui-state-disabled"))
                return;

            // If jQuery Validation is not present or the form is valid, the form is valid
            if (!$theForm.valid || $theForm.valid())
                return;

            // Re-wire the event
            $theButton.removeClass('ui-state-disabled');
            event.preventDefault();
            tieButtonToForm();
        });
    });
};
于 2014-02-19T19:01:42.627 に答える
0

数行のコードで同様の問題を修正できました。ユーザーがダブルクリックしたことを「警告」したくない場合は、これを好みます。2回目のクリックは黙って無視します。

クリティカル セクションで関数が実行されているときに切り替えるグローバルな JavaScript 変数を作成しました。これにより、後続の関数呼び出しで同じセクションが再実行されなくなりました。

 var criticalSection = false;

 SomeOnClickEventFired = function () {
      if (!criticalSection)
      {
            criticalSection = true;
            //Ajax Time
            criticalSection = false;
      }
 }
于 2015-10-12T18:57:10.803 に答える