2011-01-10 10 views
0

うまくいけば、この素晴らしいサイトの1人が助けてくれるでしょう。私は変数をjQueryのajax呼び出し応答テキストに割り当てることに問題があります。jQueryのAjax応答テキストを変数constantyに代入すると、nullが返されます。

私は提出されたときに、電子メールアドレスがデータベース内で見つかるように私の "checkemail"機能を実行するフォームを持っています。見つかった場合、responseText == "true"、そうでなければ "false"。これはうまく動作し、Firebugを使ってOKでも見えますが、応答テキストを割り当てるべき実際の変数は常に ""表示されているので、関数は常に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; 
      } 

     } 

もし誰かが私が間違っていることを指摘してくれれば、大変感謝しています。

答えて

1

あなたのAJAX URLはEDIT ./

var EmailCheckRes = $.ajax({ 

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

    }).responseText; 

を使用してemailcheck.phpない相対システムパスのウェブURLにする必要がある:あなたは、同期サーバ要求に切り替えるための最適なソリューションではありませんがかもしれませんajaxオプションasync: falseを設定するだけで、ブラウザはレスポンスが続行されるのを待っているので、問題は解決されます。また、絶対パスに切り替えること、および/または相対パスの先頭から./を削除することをお勧めします。私はこのオプションの追加をサンプルコードに反映しました。

+0

こんにちは、応答をありがとう。私は物事を再構成しましたが、成功関数内でtrue/falseを返すことは、全体のチェック・メール関数からではなく、ajax関数からtrue/falseを返すだけなので、いくつかのスコープの問題を引き起こすようです。現時点では、checkemail()は常にtrueに戻り、フォームが送信されます。副次的なこととして、相対URLから絶対URLに変更することは何の違いもないと私は考えていません。 –

+0

@ Dan Twining「成功」コールバックを利用するためにコードを再構成したくないので、別のアプローチをとるように答えを調整しました – jondavidjohn

+0

ありがとう!同期の設定は完全に機能しました。私はここで何かを学んだ。 –

3

問題は、あなたのAjaxリクエストが完了する前のcheckEmail機能がを返しているので、$アヤックス方法は、非同期(async)実行なっていることです。

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

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

1

コードを再構成する必要があります。ほとんどのAJAX呼び出しは非同期であり、呼び出しの完了を待たずにコードの流れが進むことを意味します。

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

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

のために:

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."); 
     } 
    }); 
} 
+0

ありがとうDerek、私は成功の呼び出しを使用することについて理解していますが、私は実際に外部で使用できるajax関数から実際に何かを返す方法についてまだ不明です。これは、同期Ajax関数に変更することがこれを行うことができます唯一の方法ですが、私は別の言いたいことが大好きだと私には思われる。 –

+0

あなたは何も返さず、成功とエラーを表すためにそれらをそのまま残します。 –

+0

あなたは何も返さず、成功とエラーを表すためにそれらをそのまま残します。通常のコードフローでは、スクリプトレスポンスを待つ他の領域があります。 async AJAXの場合と同様に、その待機時間をシミュレートする必要があります。たとえば、電子メールフィールドにクラスを追加して( 'class =" invalid "')、AJAX呼び出しを実行することができます。スクリプトがあなたに ''無効な ''クラスを残すか、 ''有効な ''クラスに切り替えるかを返します。フィールドを検証するには、 ''有効な ''クラスを確認してください。 –

0

私は本当にに苦労:あなたのコードに適用される

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

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

    Ajax(); 
} 

、それはこのような何かを行くかもしれ

有意義に、あなたは変更する必要がありますイベントの "document.ready"ステージでjQuery ajaxの結果を変数に取り込みます。

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

私は多くの、多くの、多くの異なる方法を試してみましたが、最終的に、私は必要な答えは、このstackoverflowのページにあった:貢献者チャールズGuilbertにJQuery - Storing ajax response into global variable

おかげで、私は私の変数にデータを取得することができています、私のページが最初にロードされても。ここで

は、作業スクリプトの例です:

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"); 
関連する問題