2011-01-10 2 views
0

희망 한 null를 돌려줍니다. 변수를 jQuery ajax 호출 응답 텍스트에 할당하는 데 문제가 있습니다.지정 jQuery를 아약스 응답 텍스트는 도움이 될 수 있습니다이 큰 사이트에 당신의

나는 submited 때 데이터베이스에서 찾을 수있는 이메일 주소를 varify 내 "에서 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

아약스 URL을 emailcheck.php의 웹 URL이 아닙니다 사용하여 상대 시스템 경로가 될 필요가 편집이 ./

var EmailCheckRes = $.ajax({ 

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

    }).responseText; 

: 그것은 동기 서버 요청에 전환 할 수있는 최적의 솔루션이 아니지만, 당신은 수도 브라우저가 응답을 계속하기를 기다리는 Ajax 옵션 async: false을 설정하면 문제가 해결됩니다. 또한 절대 경로로 전환하거나 상대 경로 앞에서 ./을 제거하는 것이 좋습니다. 예제 코드에이 옵션 추가를 반영했습니다.

+0

안녕하세요, 감사합니다 :

여기에 작업 스크립트의 예입니다. 나는 물건을 재구성했지만 성공 함수 내에서 true/false를 리턴하는 것은 전반적인 checkemail 함수가 아니라 ajax 함수에서 true/false를 리턴하기 때문에 일부 범위 문제를 일으키는 것으로 보입니다. 현재 checkemail()은 항상 true를 반환하고 양식이 제출됩니다. 참고로 절대 URL을 절대 URL로 변경하면 차이가 발생하지 않는다고 생각합니다. –

+0

@ Dan Twining'success' 콜백을 이용하기 위해 코드를 재구성하지 않기를 바란다는 나의 답변을 조정했습니다. – jondavidjohn

+0

고마워요! 동기화 설정이 완벽하게 작동했습니다. 나는 여기서 뭔가를 배웠다. –

3

문제는 $ 아약스 방법은 그래서 위해 checkEmail 기능이 완료 귀하의 아약스 요청하기 전에 을 반환하는 비동기 실행지고 있다는 점이다.

응용 프로그램의 흐름은 선형 아니므로 checkmail에서 반환 값은 아약스 요청에서 반환 된 반응을 반영하지 않습니다.

코드를 재구성하여 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 함수에서 실제로 뭔가를 반환하는 방법에 대해서는 여전히 확신이 없습니다. 동기식 아약스 함수로 바꾸는 것이 이것이 할 수있는 유일한 방법 인 것처럼 보이지만 달리 말해야한다고 생각합니다. –

+0

당신은 아무것도 반환하지 않습니다, 나는 그저 성공과 오류를 나타 내기 위해 그곳에 두었습니다. –

+0

당신은 아무 것도 반환하지 않습니다, 나는 그저 성공과 오류를 나타 내기 위해 그것들을 남겨 두었습니다. 일반적인 코드 흐름은 스크립트 응답을 기다리는 다른 영역을 만듭니다. async AJAX와 마찬가지로 대기 시간을 시뮬레이션해야합니다. 예를 들어 이메일 필드에 클래스를 추가하고 ('class = "invalid"') AJAX 호출을 실행할 수 있습니다. 스크립트가 당신에게''invalid ''클래스를 남기거나''유효한''클래스로 전환 할 때 리턴합니다. 필드의 유효성을 검사하려면''유효한 ''클래스가 있는지 확인하십시오. –

0

정말 고생 : 코드에 적용

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

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

    Ajax(); 
} 

, 그것은 이런 식으로 뭔가를 갈 수

의미, 당신은 변경해야 이벤트의 "document.ready"단계에서 jQuery 아약스의 결과를 내 변수로 가져온다.

페이지가 이미로드 된 후 사용자가 선택 상자의 "onchange"이벤트를 트리거했을 때 jQuery의 ajax가 내 변수에로드되지만 페이지가 처음로드 될 때 데이터가 변수에 공급되지 않습니다.나는 내 변수에 데이터를 얻을 수 있어요, 기여 찰스 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");