1

したがって、送信をクリックすると、送信する前に検証を行いたいフォームがあります。かなり簡単だと思います。そのため、フォームに送信ハンドラーを設定し、AJAX チェックを実行するようにしました。終了したら、問題がなければ通常どおり送信します。

私はこれを試しましたが、非常に明白な理由で失敗しました:

$.when(checkUsername()).done(function (a) {
    checkTitle();
    checkMessage();

    if (userValid && titleValid && messageValid) {
        return true;
    }
});

return false;

checkUsername$.post、 whileは、これらのフィールドに文字があるかどうかを確認checkTitleしているだけです。各関数は、 、、および をcheckMessage相対的に検証し、それらの値を true または false に設定します。2 つの入力フィールドとテキスト領域フィールドには、関連する各機能にぼかしが適用されているため、ユーザーが送信をクリックする前であっても、フォームは検証されています。userValidtitleValidmessageValid

したがって、明らかに、最後に false が返されると、フォームは送信されません。しかし、私はもともと有効なチェックを行っていませんでした(現在の戻り値は false です)。ユーザーが3つの有効なアイテムを入力した場合、フィールドを消去してそのままにしませんでした/ぼかし、送信を直接クリックしても、それでもAJAX がまだ処理中で、フィールドが 2 回目のチェックを受けていないためです。

基本的に、AJAX が終了するまでフォームの送信を待機する必要があります。しかし、submit()関数は AJAX が終了する前に戻り値を処理します。送信時に AJAX をトリガーする必要があるため、完了にはできません。基本的に、キャッチ22。

私はそれを行うのが面倒だと感じる何かを思いつきましたが、現時点で私が考えることができる唯一の方法であり、これがそれを行う唯一の方法であるか、または他にどのようなオプションがあるかについてアドバイスを使用できます. AJAX 経由でフォームを送信できることは承知していますが、利用可能なオプションを確認したいと考えています。これは厄介な方法です:

if (validated) return true;
else {
    $form = $(this);
    $.when(checkUsername()).done(function (a) {
        checkTitle();
        checkMessage();

        if (userValid && titleValid && messageValid) {
            validated = true;
            $form.submit();
        }
    });

    return false;
}

この場合、ajax によってのみ設定されるマスター検証変数があり、システムは完了すると再送信します。

4

2 に答える 2

0

あなたの解決策は進むべき道です。.done メソッドは非同期実行であるため、コンテキストが異なります。つまり、検証メソッドは呼び出し時に常に false を返します。

于 2013-04-29T06:04:58.127 に答える
0

検証は非同期であるため、ちょっとしたトリックを行う必要があります。関数を使用して.data()、フォーム データが検証されたかどうかを確認できます。そうでない場合は、検証を行います。検証では、validatedデータをtrueに設定し、 submitjquery経由で再度トリガーできます。

もう 1 つ注意してください。JavaScript の検証はバイパスされる可能性があるため、フォーム サーバー側で受け取ったデータを再度検証していただければ幸いです。

$(form)をフォーム要素またはフォームへのクエリに置き換える必要があり ます。

$(form).submit(function(event) {
    //check if already validated
    if (!$(this.data("validated")) {

        doValidation();
        //prevent form form submitting because validation is in progress.
        event.preventDefault();
    }

});



function doValidation() {

    //do you validation suff.
    $.when(checkUsername()).done(function(a) {
        checkTitle();
        checkMessage();

        if (userValid && titleValid && messageValid) {
            //mark the form as validated
            $(form).data("validated", true);
            //trigger submit via jquery
            $(form).submit();
        }
    });

}

または、ajaxの方法でフォームを投稿します$.post(ファイル入力要素がない場合にのみ機能します)。

$.post($(form).attr("action), $(form).serialize());
于 2013-04-29T06:07:33.220 に答える