0

うまくいけば、この素晴らしいサイトの誰かが助けてくれます. jQuery ajax 呼び出し応答テキストへの変数の割り当てに問題があります。

送信時に「checkemail」機能を実行して、メールアドレスがデータベースにあることを確認するフォームがあります。見つかった場合は responseText == "true"、そうでない場合は "false" です。これは問題なく動作し、Firebug を使用して問題なく表示できます....しかし、応答テキストが割り当てられる実際の変数は常に "" を表示するため、関数は常に false を返します。

        function checkemail(){

            var EmailFromForm = $("#lostemail").val();

            var EmailCheckRes = $.ajax({

            type        : "POST",
            cache       : false,
            url         : "./scripts/passreset/emailcheck.php",
            data        : "Email="+EmailFromForm,
            dataType        : "text",

      }).responseText;


            if (EmailCheckRes == "true")
            {
                alert("Should say true:  " + EmailCheckRes);
                return true;
            }
            else
            {
                $("#ErrorMsg").html("Your email address is either invalid or not found.");
                alert("Should say false:  " + EmailCheckRes);
                return false;
            }   

        }   

誰かが私が間違っていることについての指針を持っているなら、それは大歓迎です。

4

4 に答える 4

3

問題は、$。ajaxメソッドが非同期で実行されるため、 ajaxリクエストが完了する前にcheckemail関数が返されることです。

アプリケーションのフローは線形ではないため、checkmailからの戻り値は、ajaxリクエストから返された応答を反映しません。

コールバックを取得し、ajaxリクエストが完了したときにそれを実行するように、コードを再構築する必要があります。

于 2011-01-10T01:21:53.610 に答える
1

emailcheck.phpあなたのajax URLは、相対システムパスではないWeb URLである必要があります./

var EmailCheckRes = $.ajax({

    type        : "POST",
    cache       : false,
    async       : false,
    url         : "scripts/passreset/emailcheck.php",
    data        : "Email="+EmailFromForm,
    dataType    : "text",

    }).responseText;

EDIT :同期サーバー リクエストに切り替えるのは最適な解決策ではありませんが、 ajax オプションasync: falseを設定するだけで、ブラウザーが応答の続行を待機するようになり、問題が解決するはずです。また、絶対パスに切り替えるか./、相対パスの先頭から を削除することをお勧めします。このオプションの追加をサンプル コードに反映しました。

于 2011-01-10T00:46:19.740 に答える
1

コードを再構築する必要があります。ほとんどの AJAX 呼び出しは非同期です。つまり、コードのフローは呼び出しが完了するのを待たずに進みます。

意味のあることに、次のように変更する必要があります。

function checkmail() {
    var checkThis = Ajax();

    if (checkThis) {
        DoSomething();
    }
    else {
        DontDoSomething();
    }
}

為に:

function checkmail() {
    Ajax.success = function(checkThis){
        if (checkThis) {
            DoSomething();
        }
        else {
            DontDoSomething();
        }
    };

    Ajax.error= function(){
        ReportSomeError();
    };

    Ajax();
}

コードに適用すると、次のようになります。

function checkemail () {
    var EmailFromForm = $("#lostemail").val(),

    $.ajax({
        type:"POST",
        cache:false,
        url:"./scripts/passreset/emailcheck.php",
        data:"Email="+EmailFromForm,
        dataType:"text",
        success:function(EmailCheckRes){
            if (EmailCheckRes == "true") {
                alert("Should say true:  " + EmailCheckRes);

                /* You cannot longer "return" this value, add code to do
                 * what you need done
                 */
                return true;
            }
            else {
                $("#ErrorMsg").html("Your email address is either invalid or not found.");
                alert("Should say false:  " + EmailCheckRes);

                /* You cannot longer "return" this value, add code to do
                 * what you need done
                 */
                return false;
            }
        },
        error:function(){
            $("#ErrorMsg").html("There was an AJAX communication error.");
        }
    });
}
于 2011-01-10T03:49:15.480 に答える
0

イベントの「document.ready」段階で、jQuery ajax の結果を変数に入れるのに本当に苦労しました。

ページが既に読み込まれた後にユーザーが選択ボックスの「onchange」イベントをトリガーすると、jQuery の ajax が変数に読み込まれますが、ページが最初に読み込まれたときにデータが変数にフィードされませんでした。

私は非常に多くの異なる方法を試しましたが、最終的に必要な答えは、このスタックオーバーフローのページでした: JQuery - グローバル変数への ajax 応答の保存

寄稿者の Charles Guilbert のおかげで、ページが最初に読み込まれたときでも、データを変数に入れることができます。

作業スクリプトの例を次に示します。

jQuery.extend
(
    {
        getValues: function(url) 
        {
            var result = null;
            $.ajax(
                {
                    url: url,
                    type: 'get',
                    dataType: 'html',
                    async: false,
                    cache: false,
                    success: function(data) 
                    {
                        result = data;
                    }
                }
            );
           return result;
        }
    }
);

// Option List 1, when "Cats" is selected elsewhere
optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

// Option List 1, when "Dogs" is selected elsewhere
optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

// Option List 2, when "Cats" is selected elsewhere
optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

// Option List 2, when "Dogs" is selected elsewhere
optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");
于 2012-09-19T17:25:50.410 に答える