2012-01-01 6 views
2

사용자가 "제출"을 클릭하면 먼저 선택한 사용자 이름이 이미 사용되었는지 확인하고 싶습니다. 나는 이것에 대한 아약스를 사용아약스 호출 대기 없음

function submit() { 
    if (userNameTaken()) { 
     alert("Please choose a username that is not already in use."); 
     return false; 
    } 
} 

function userNameTaken() { 
    var taken = false; 
    var username = $("#username").val(); 
    $.get("username_used.cgi", { "username": username }, function(data) { 
     taken = data > 0; 
    }); 
    return taken; 
} 

그래서 나는 이름을 촬영할 때, 기능 userNameTaken()가 true를 돌려 않는다는 것을 알고있다.

그러나 양식은 마치 자바 스크립트가 일시 중지하지 않고이 아약스 호출이 끝나기를 기다리지 않고 마치 계속 진행되고 계속 평가됩니다. 내 양식이 아약스 전화를 기다리고 제출하지 않도록이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

-1

정상적인 하향식 프로세스에서는 Ajax가 실행되지 않으므로 체크하십시오. 제출하면 아약스 응답을 기다리지 않습니다. 수동으로 양식을 제출할 수 있도록 normal button 대신 submit button을 사용할 수 있습니다. 다른 촬영하지 usename이 경고를 보여 주면

<form ... > 
// other parts 

<input type="button" value="sumbit" onclick="userNameTaken();"/> 
</form> 

변화

function userNameTaken() { 
    var username = $("#username").val(); 
    $.get("username_used.cgi", { "username": username }, function(data) { 
     if(data > 0){ 
      alert("Please choose a username that is not already in use."); 
     }else{ 
      // validation goes here 
      $('form').submit(); 
     } 
    }); 
} 

같은 코드는 그래서 아약스 응답을 확인하고보다 양식을 제출합니다. 당신은 어떤 id를 버튼에 넣고 jquery를 사용하여 쉽게 처리 할 수 ​​있습니다.

+0

사용자가 단순히 입력 필드 중 하나에 엔터를 치면 폼은 기꺼이 바이 패스 검증을 제출하게됩니다. –

+0

IE를 제외한 모든 브라우저에서 제출 버튼없이 제출이 작동한다는 점을 알아야합니다. http://jsfiddle.net/liho1eye/cdwqs/를 사용해보십시오. 대답은 적절하지만 심각하게 결함이 있습니다. 버튼에 액션을 제출하지 마십시오. 게시 한 링크의 명확하고 위험한 오답에 대한 섹션을 참조하십시오. –

+0

: P 감사합니다.하지만이 이벤트는 keyup 및 preventDefault를 사용하면 쉽게 예방할 수 있습니다. 또한 대답이 정확하고 OP에 도움이된다는 것을 알 수 있으므로 중요하지 않습니다. –

2

다음과 같이 Ajax 호출에서 데이터를 반환 할 수 없습니다. Ajax 호출은 임의의 미래의 시간에 반환되지만 userNameTaken()에 대한 호출은 Ajax 요청이 완료되기 전에 즉시 반환됩니다.

브라우저 UI를 정지 할 위험이 있으므로 호출을 동기식으로 설정할 수 있습니다. IMO 선호하지 않습니다. 나는 ...에 "확인"플래그를 설정하거나 제출 버튼을 활성화하거나 경고를 팝업, 또는 할

FWIW을 콜백 함수를 사용

또는 이름 만 사용하지 않는 경우 제출을 허용 팝업 알림 찾기 매우은 원활한 UX에 방해가되지 않습니다.

1

Ajax 호출의 "async"설정을 "false"로 설정해야합니다. 이렇게하면 호출이 반환 될 때까지 함수가 차단됩니다.

다음은 JQuery 문서에 대한 링크입니다. "async"설정을 확인하십시오 :http://api.jquery.com/jQuery.ajax/

+0

@srchulo - 'async : false'를 설정하면 브라우저가 ajax 호출 동안 멈추고 응답하지 않는 것을 알아야합니다 . 이것은 권장 된 방법은 아닙니다. 권장되는 방법은 성공 처리기에서만 ajax 호출의 결과를 처리하도록 코드를 변경하는 것입니다. 이를 위해서는 코드 흐름이 어떻게 작동하는지 다시 생각해 봐야하지만 올바른 작업을 수행 할 때 사용자 환경을 개선해야합니다. – jfriend00

+0

나는 단지 그와 같을 무엇인가 시험해 보았다.. 그러나 누군가 좋아하고, 투표를하지 않았다. 나는 그것이 그렇게 할 수 있다고 느낍니다. pls는 내 대답을보고 당신의 견해를 알려줍니다. –