2

メールアドレスをチェックして有効かどうかを判断するPHPスクリプトがあります。関数は単にtrueまたはを返しますfalse。phpファイルへのajax呼び出しを実装し、trueまたはfalseをjavascript関数に戻そうとしています。現在、何も得られていません。

function validateForm() {
    var email = document.forms["contact"]["email"].value;
    var validEmail;

    $.ajax({
        type: "POST",
        url: "validateEmail.php",
        data: "email=" + email,
        success: function(result) {
            validEmail = result;
            console.log('result: ' + validEmail);
        }
    });
}

trueまたはを取得できる場合falseは、ブールチェックを実行して続行方法を決定します。ユーザーがフォームの送信ボタンをクリックすると、関数validateForm()が呼び出されます。

<form name="contact" action="submitOrder.php" onsubmit="return validateForm();" method="post">

メールアドレスが有効でない場合に関数がfalseを返し、submitOrder.phpが呼び出されないようにしたいのvalidateForm()ですが、AJAXの非同期性のため、これを行う方法がわかりません。

アップデート

リクエストは正しく機能しています(私はかなり確信しています)。これは私がFirebugで見ているものです。 ここに画像の説明を入力してください まだ何も返されていません。コンソールは「結果:」を出力します。また、validateEmail.phpを変更して番号17を返しましたが、それでも何も返されません。

助けてくれてありがとう!

4

7 に答える 7

1

JQueryValidateプラグインを使用します。これを最初からハッシュするよりもはるかに簡単です。

于 2012-05-31T23:35:57.093 に答える
0

jQueryのajax関数はデフォルトで非同期です。つまり、ajaxリクエストを作成してから戻ります。おそらく、asyncパラメーターをfalseに設定validEmailしてから、実行しているように成功関数を設定する必要があります。その後、ajax呼び出しの後にvalidEmailを安全に返すことができます。

function validateForm() {
  var email = document.forms["contact"]["email"].value;
  var validEmail = false;

  $.ajax({
    type: "POST",
    url: "validateEmail.php",
    async: false,
    data: "email=" + email,
    success: function(result) {
        validEmail = result;
        console.log('result: ' + validEmail);
    }
  });

  return validEmail;
}
于 2012-05-31T23:27:51.887 に答える
0

私はあなたが行方不明だと思います; jquery呼び出しの最後に

$.ajax({
    type: "POST",
    url: "validateEmail.php",
    data: "email=" + email,
    success: function(result) {
        validEmail = result;
        console.log('result: ' + validEmail);
    }
});

ajaxの呼び出しと応答で何が起こっているかを確認できるように、firebugをインストールすることをお勧めします。そうすれば、はるかに簡単にデバッグできるはずです。

于 2012-05-31T23:28:31.320 に答える
0

AJAX呼び出しを同期させたくない場合、結果が有効であれば、Ajax呼び出しを送信させることができます。validateFormを呼び出し、onsubmitにfalseを返します。(直交しないため、validateForm自体がfalseを返すようにはしません)。

于 2012-05-31T23:30:18.453 に答える
0

event.preventDefault();が必要だと思います。非同期呼び出しを正しく機能させるには

$('#submit-button-id')。click(function(event){event.preventDefault();});

これにより、何らかの検証が行われる前に、ブラウザがフォームを送信するのを停止する必要があります。(これを起動するために参照できるクラスまたはIDを送信ボタンに指定する必要があることに注意してください)。

http://api.jquery.com/event.preventDefault/

于 2012-05-31T23:31:58.507 に答える
0

ブラウザを一時的にロックする可能性があるため、ajax呼び出しに同期オプションを使用することはお勧めしません。jqueryのajax()ページからの次の引用に注意してください。

同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はアクションを無効にする可能性があることに注意してください。

代わりに、フォームを送信するボタンでvalidateForm関数を呼び出すことができ、ajaxの成功が呼び出されると、フォームを送信できます。

function validateForm() {
    var email = document.forms["contact"]["email"].value;

    $.ajax({
        type: "POST",
        url: "validateEmail.php",
        data: "email=" + email,
        success: function(result) {
            if (result == true)
                document.forms["contact"].submit();
        }
    });
}
于 2012-06-01T00:13:54.943 に答える
0

使用するasync: falseことは、JavaScriptを不必要にブロックするため、AJAXを使用するための不適切な方法です。攻撃者がjavascriptを無効にして無効なフォームを送信する可能性があるため、jQueryValidateなどのクライアント側のバリデーターを使用することは危険です。サーバー側の検証は必須であり、古き良きAJAXで実行できます。

キーはコールバックです。validateFormAJAXは非同期(非ブロッキング)であるため、返そうとするものはすべて、AJAX呼び出しが返される前に返されます。これは、すべてのjavascriptの実行を一時停止せずに、AJAX成功関数から値を返すことができないことを意味します。代わりに、AJAX成功関数が呼び出すことができるパラメーターとしてコールバック関数を渡します。そのコールバック内で、ブール値のチェックを実行して、続行する方法を理解できます。これはsuccess関数(実際にはコールバックです!)内で直接行うこともできますが、コールバックパラメーターと他の関数はコードを少し切り離します。これは良い習慣です。私はあなたのコードを修正して、私が言っていることの例を示しました。

function validateForm(callback) {
    var email = document.forms["contact"]["email"].value;
    var validEmail;

    $.ajax({
        type: "POST",
        url: "validateEmail.php",
        data: "email=" + email,
        success: function(result) {
            validEmail = result;
            console.log('result: ' + validEmail);
            callback(result);
        }
    });
}

function doSomethingWithResult(result) {
    if (result === True) {
        // Do true stuff
    } else {
        // Do false stuff
    }
}

validateForm(doSomethingWithResult);
于 2013-12-03T22:21:47.497 に答える