4

Bootstrap レイアウトとjQuery Validation Pluginを使用しています。ボタンをクリックすると、フォームのモーダルが開きます。ユーザーはいくつかのデータを入力し、すべてが正しくなるまで改善します。彼がそれを送信するとajax、モーダル フォームを呼び出して閉じる必要があります (ただし、検証が失敗した場合は、ajax もモーダル クロージングも行わないでください)。以下は私のコードです:

ajax 呼び出し

$('#outcomeFormDialog form').on( "submit", function( event ) {
    var form = $(this);
    $.ajax({
        type: form.attr('method'),
        url: "../php/client/json.php",
        data: form.serialize(),
        success: function(data, status) {
            $(this).modal('hide');
        }
    });

    event.preventDefault();
});

現在の検証コード:

 $('#outcomeFormDialog form').validate(
 {
  rules: {
    amount: {
      money: true,
      required: true
    },
    comment: {
      required: false
    }
  },
  highlight: function(element) {
    $(element).closest('.control-group')
    .removeClass('success').addClass('error');
  },
  success: function(element) {
    element
    .addClass('valid').closest('.control-group')
    .removeClass('error').addClass('success');
  }
 });

私が理解している限り、jquery の検証successはフォーム全体ではなく各フォーム要素に対応しているため、フォーム全体の検証を別の方法で確認する必要があります。

これは私のフォームです(口ひげ主導):

<div id="outcomeFormDialog" class="modal hide fade" role="dialog">
    <form class="form-horizontal well" data-async data-target="#outcomeFormDialog" method="POST">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">×</button>
            <h3 id="myModalLabel">Add outcome</h3>
        </div>
        <div class="modal-body">
            <fieldset>
                <input name="type" type="hidden" value="add_outcome" />
                <div class="control-group">
                    <label class="control-label" for="amount">Amount</label>
                    <div class="controls">
                        <div class="input-prepend">
                            <span class="add-on">{{ currency }}</span>
                            <input type="text" name="amount" class="input-xlarge" placeholder="00.01" />
                        </div>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="comment">Comment</label>
                    <div class="controls">
                        <input type="text" name="comment" class="input-xlarge" placeholder="Comment here..." />
                    </div>
                </div>
            </fieldset>
        </div>
        <div class="modal-footer">
            <button class="btn" data-dismiss="modal">Close</button>
            <button type="submit" class="btn btn-primary">Save outcome</button>
        </div>
    </form>
</div>
4

1 に答える 1

9

このプラグインに関して、いくつかの一般的な問題と誤解があります。

  • submitハンドラーは必要ありません。ボタンのclickイベントは、submitこのプラグインによって自動的にキャプチャされ、処理されます。

  • docs に従って、ajaxプラグインのsubmitHandlerコールバック オプション内に配置することになっています。

submitHandler : コールバック、デフォルト: デフォルト (ネイティブ) フォーム送信

フォームが有効な場合に実際の送信を処理するためのコールバック。唯一の引数としてフォームを取得します。デフォルトの送信を置き換えます。検証後に Ajax 経由でフォームを送信するのに適した場所。

あなたが適切に書かれていると仮定するとajax、コードを次のように再配置します。

$(document).ready(function () {

    $('#outcomeFormDialog form').validate({  // initialize plugin
        rules: {
            amount: {
                // money: true, //<-- no such rule
                required: true
            },
            comment: {
                required: false // superfluous; "false" same as leaving this rule out.
            }
        },
        highlight: function (element) {
            $(element).closest('.control-group')
                .removeClass('success').addClass('error');
        },
        success: function (element) {
            element.addClass('valid').closest('.control-group')
                .removeClass('error').addClass('success');
        },
        submitHandler: function (form) {
            // form validates so do the ajax
            $.ajax({
                type: $(form).attr('method'),
                url: "../php/client/json.php",
                data: $(form).serialize(),
                success: function (data, status) {
                    // ajax done
                    // do whatever & close the modal
                    $(this).modal('hide');
                }
            });
            return false; // ajax used, block the normal submit
        }
    });

});

動作デモ: http://jsfiddle.net/duAkn/

于 2013-03-31T04:39:40.177 に答える