2011-09-27 3 views
0
function check_username(){ 
    $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: "/ajax/check/username.html", 
     data: "via=ajax&username="+$('input[name=register_username]').val(), 
     success: function(msg){ 
      if(msg.response==false){ 
       register_username.parent().css('background-color','#db2e24'); 
       register_username.parent().parent().find('td:last-child').text(msg.message); 
       register_username.focus(); 
       return false; 
      } else { 
       register_username.parent().css('background-color','#fff'); 
       register_username.parent().parent().find('td:last-child').text(""); 
       return true; 
      } 
     } 
    }); 
} 

영어 실력이 좋지 않은 경우 미안 해요은 - 영어 나의 모국어가 아닌. 주제 위로, 왜 위의 함수는 항상 false를 반환합니까? 참고 : JSON은 정상입니다.jQuery AJAX 함수가 항상 false를 반환하는 이유는 무엇입니까?

+1

이 – Linsey

+1

당신이'undefined'을 반환하지 않는 것 확실 falsey입니다'undefined' (아무것도)를 반환하지 않기 때문에? 'check_username()'함수에는 return 문이 없으므로 undefined가 반환됩니다. 성공 핸들러 함수 안에있는 return 문은 check_username()이 아닌 _that_ function을위한 것입니다. – nnnnnn

+0

실제로 Ajax 호출에서 reponseText를 리턴합니다. 함수 매개 변수가 잘못되었습니다. – b01

답변

4

check_username은 네트워킹 작업을 시작한 후 즉시 반환하는 ajax 함수를 호출합니다. check_username은 ajax 호출이 완료되고 성공 처리기가 호출되기 훨씬 전에 반환됩니다. 따라서 성공 처리기는 check_username이 반환하는 값과 아무 관계가 없습니다.

(만 포함 된 성공 핸들러 함수로) check_username 함수 자체에는 반환 값이 없기 때문에, falsey 값 check_username 반환 undefined, 따라서 당신은 항상 false를 반환 것 같아요. 당신이 성공 핸들러의 리턴 값으로 뭔가를하려는 경우

는, 당신은 성공 핸들러 자체에서 작동 중이 아니면 성공 핸들러에서 다른 함수를 호출해야합니다. 이것이 비동기식 작동 방식입니다.

성공 핸들러 함수에서 true 또는 false 반환은 아무것도하지 않는다. 성공 처리기는 아약스 처리 코드의 내부에서 호출되며 성공 처리기에서 반환하면 아약스 내부의 내부로 들어갑니다. 성공 핸들러의 리턴 값은 어떤 식으로도 사용되지 않습니다.

+0

그렇다면 어떻게 success_handler의 문을 check_username()에 전달합니까? –

+0

할 수 없습니다. 'check_username'은 성공 핸들러가 호출 될 때 이미 완료되었습니다. 반환 된 데이터로 무엇을하고 싶든 성공 핸들러에서 수행하거나 다른 함수를 호출하여 ajax 데이터를 전달할 수 있습니다. – jfriend00

0

문제는 응답 부울없고, 이것이 항상 거짓으로 평가 .. == 잘못된 논리 상태 msg.response이다. 대신 응답 상태를 확인해야합니다.

+0

응답 부울이다 내가로 json_encode 사용하고 (배열 ("응답"= "TRUE)); 그렇지 않으면 php –

+1

이 잘못된 것입니다; 함수는 ajax 호출이 반환되기 전에 반환됩니다. –

0

내 추측이 있다면, 당신이 게시하고 반환 된 응답이 JSON 객체입니다. 그러나 당신이 유효한 응답을 받았는지 확인하는 것만 보입니다. 이런 식으로하지 이유 :

이 시도 : 당신이 할 수

function check_username() 
     { 
      $.ajax({ 
       type: "POST", 
       dataType: 'json', 
       url: "/ajax/check/username.html", 
       data: "via=ajax&username="+$('input[name=register_username]').val(), 
       success: function(msg, textStatus) 
       { 
        if (textStatus == "success") 
        { 
         register_username.parent().css('background-color','#db2e24'); 
         register_username.parent().parent().find('td:last-child').text(msg.message); 
         register_username.focus(); 
         return false; 
        } else { 
         register_username.parent().css('background-color','#fff'); 
         register_username.parent().parent().find('td:last-child').text(""); 
         return true; 
        } 
       }, 
       error: function(jqXHR, textStatus, errorThrown) 
       { 
        if (textStatus == "parsererror") 
        { 
         alert("There is an error in your JSON object"); 
        } 
       } 
      }); 
     } 

다른 문제는 당신이 jQuery를 확인합니다 유효한 JSON을 반환하지 않는 것입니다. 오류를 추가하면 이것이 사실인지를 알 수 있습니다.

라이브 데모 http://jsfiddle.net/khalifah/4q3EJ/

+0

200은 헤더입니까, 그렇지 않습니까? –

+2

성공 함수가 비동기 적으로 호출되기 때문에이 정답은 * WRONG *입니다. - success 함수는 Ajax 기계에 의해 호출되며, check_username 함수를 포함하는 스택/호출 스레드의 일부가 아닙니다. 당신은 ajax 호출을 동기식으로 바꿀 수 있지만, 이것은 매우 빈약 한 UX가 될 것입니다. –

+0

아무 일도 없었습니다. T_T –

관련 문제