1

ユーザーがダイアログフォームを2回送信しないようにしたいと思います。

これが私の送信コードです:

$('form', dialog).submit(function () {
    if (dialogSubmitted) { return false; }
    dialogSubmitted = true;
    ...
    ...
});

ここで、dialogSubmittedは、フォームがすでに送信されているかどうかを示す変数です。問題はそれが機能しないことです。ダイアログを開いてEnterキーを2回(すばやく)押すと、フォームが2回送信されます。

何か案が?

ありがとう。


アップデート

エンターキーを2回すばやく押すと失敗した別の試みがあります。

    $('form', dialog).one('submit', function (evt) {

        evt.preventDefault();

        $(this).on('submit', function (evt) {
            evt.preventDefault();
        });

        $.post($(this).attr('action'), $(this).serialize(), function (data, status) {
            $('#my-modal').modal('hide');
            ...
            ...
        }).error(function (error, status, a, b) {
            $('.modal-body p.body').html(error.responseText);
            writeError('msgError', pStopIndex.validationFailed);
        });

        // Unbind form submitting
        $('form', dialog).unbind();
        return false;
    });

ご覧のとおり、私はajax投稿を行います(従来のフォーム送信の代わりに)。多分問題はありますか?

GoogleChromeからのトレースのキャプチャは次のとおりです。

ここに画像の説明を入力してください

2つの投稿があることがわかります。Enterキーをすばやく2回押すか、送信ボタンをすばやく2回クリックした場合にのみ発生します。

何か案が?ありがとう。

4

1 に答える 1

4

one()方法を使用するだけ

フィドルの例を参照してください:http://jsfiddle.net/MpBCL/

$('form', dialog).one('submit', function (evt) {

    /* prevent default action */
    evt.preventDefault();

    ...
    /* code to be executed once */
    ...

    /**
     * disable default action (this handler will be attached after first 
     * submit event and it will prevent any further submit action
     */
    $(this).on('submit', function (evt) {
       evt.preventDefault();
    });

});

詳細情報:http://api.jquery.com/one/

説明: 要素のイベントにハンドラーをアタッチします。ハンドラーは、要素ごとに最大1回実行されます。

于 2012-04-26T11:27:01.960 に答える