ajax 타이밍을 조절하고싶습니다.ㅠㅠ
본문
회원가입 스킨의 register_form.skin.php 파일에서 회원가입 버튼을 클릭하면
회원아이디검사, 비밀번호 체크등을 하기 위해서
function fregisterform_submit(f) 자바스크립트를 실행되는데요?
해당 자바스크립트 부분에 하나의 검사를 하는 구간이 더 필요해서 ajax로 제가 필요로하는
검사하는 스크립트를 만들어서 넣었습니다.
function fregisterform_submit(f) {
...........
// 회원아이디 검사
var result = "";
$.ajax({
dataType:"jsonp",
jsonp:"callback",
url: "http://xxx.com/api/ajax.mb_id.php",
data: {
"reg_mb_id": encodeURIComponent($("#reg_mb_id").val())
},
cache: false,
async: false,
success: function(data) {
result = data;
console.log(result);
},
error:function(data){
alert('회원아이디 오류 입니다.');
},
complete:function(d){
$("input[name=result").remove();
var idx = $('<input type="hidden" value="'+result.result+'" name="result">');
$('#fregisterform').append(idx);
if(result.result == 'success') {
alert("회원가입이 가능함");
return true;
} else {
alert("다른 사이트에 아이디가 존재함");
return false;
}
},
});
var ajax_msg = $('input[name=result]').val();
if (ajax_msg == 'success') {
return true;
} else {
alert("B사이트에 존재하는 회원입니다.");
f.mb_id.select();
return false;
}
...........
<?php echo chk_captcha_js(); ?>
document.getElementById("btn_submit").disabled = "disabled";
return true;
}
ajax의 complete 부분에
해당 회원가입 <form> 안에 <input> hidden을 생성하고 거기의 value를
ajax에서 가져온 결과값을 넣었습니다.
동적으로 <input>이 생성되는 것과 value에도 원하는 값이 잘 들어옵니다.
한가지 안되는부분이
ajax가 끝나고 바로 input name이 result라는 인풋의 value를 가지고 체크하는 부분이 있는데
(이 부분이 실제 ajax결과를 name = result 라는 동적으로 생성한 input의 값)
이 부분이 ajax가 통신을 하고 complete에서 <input>을 생성하는 도중 실행이 되어서
저기 스크립트 부분에서 원하는데로 검증이 되지 않습니다.ㅠㅠ
ajax를 완료하고 해당 input의 값으로 검증하는 부분을 실행시키려면 어떤 방법이있나요?
!-->
답변 3
작성하신 함수의 순차적인 흐름을 타지 않는 것은 jQuery ajax 가 의 독립된 객체이기 때문입니다.
좀더 쉽게 이해를 하자면, function 내부에 ajax 는 독립된 하나의 실행객체로 보면 될 것 같습니다. (ajax 뒤의 코드는 ajax 실행 여부(success, complete, error 등)와 관계없이 바로 실행됩니다. 작성하신 코드를 리뷰하면 서버와의 통신 속도에 따라, ajax 의 결과를 토대로 실행될 수도/안될수도 있습니다.)
그렇기 때문에, ajax 밖의 코드를 순차적으로 실행하고 싶으시다면, 코드가 ajax 안으로 들어가야 합니다.
더 좋게는 complete 부분에서 원하는 로직을 실행하기 보다는 success 에서 실행하는게 좋습니다.
complete 는 success 와 error 모든 경우에 실행되며, success 의 로직이 실행되기 전 ajax 의 data 를 받으면 바로 complete 되기 때문입니다.
굳이 함수가 밖에서 실행되야 한다면, ajax 의 success 를 감지할 수 있도록 setTimeout 이나 setInterval 등으로 감싸야 할 것 같습니다.
그누보드 원본에 있는 것처럼 리턴값을 받아서 처리하도록 하면 될텐데요?
위 소스에서는 complete내에서 아래쪽에 넣어야겠죠
그런데 complete에 체크 및 경고창 띄우는 내용이 있는데 2중으로 저렇게 하는 이유라도??
하여튼 위 소스처럼 하지말고 그누보드 원본그대로의 방법으로 응용하면 됩니다
ajax 의 complete 부분에서 결과값을 넣고,
그 결과값을 검증하는 부분이 있는데,
ajax 밖에서 다시 검증을 하는거죠?
이해가 잘 안되네요?
complete 부분에서 순차적으로 원하시는 부분을 진행해야 합니다.
혹시 코드가 길다면, 함수를 만들고 그 함수를 complete 부분에서 호출하면 됩니다.
답변이 됬는지 모르겠네요..^^