CI 묻고 답하기

제목 ajax 버그라고 생각하는데 어떻게들 생각하시나요?
글쓴이 톰소여 작성시각 2016/05/17 11:46:23
댓글 : 3 추천 : 0 스크랩 : 1 조회수 : 15663   RSS

 

ajax방식을 사용하여

쿼리를 사용하는 일반방식이 있습니다.

버튼을 누르면 ajax로 데이터가 전달되고 쿼리를 실행하는건데여

핸드폰으로 포인트 완료를 눌렀는데 포인트가 두번실행되어 2배의 점수가 쌓였습니다.

저는 이게 오류라고 보는데여 컴퓨터에서 완료버튼을 빠르게 두번 따닥하니까 완료되었다는 메세지 자바스크립트

alert창이 두번뜨더군여. 완료를 누르면 한번만 포인트가 쌓여야되는데 따닥하니까 완료되었다는

창이 두번뜨고 결국에 점수가 두번 쌓이더라구여.

점수완료를 한번한건데 두번쌓이면 크나큰 버그가 아니라고 할수없는데 다른분들은 어떠신가요??

대략적인 소스는 다음과 같습니다.

 

<script>

$('.chargebtn').on('click', function(e){       

var temp_arr = $(this).attr('id').split("_");       

var temp_id = temp_arr[1];

var jsonData = { 'idx': temp_id, 'status': 'complete' };           

e.preventDefault();           

$.post('/point/PointChargeComp', jsonData, function(data){runDataJsonResult(data);});   

});

</script>

 

위처럼 chargebtn을 누르면 데이터가 /point/PointChargeComp 경로로 전달됩니다.

아래는 컨트롤러입니다.

 public function PointChargeComp(){

  $post = $this->input->post();       

if ($this->input->is_ajax_request()) {

  $this->load->model('point_m'); 

 $this->data = $this->point_m->PointChargeComp($post);

   runAjaxDataJsonResult($this->data);       

}else{           

redirect('/error', 'refresh');       

}

 }

 

point_m->PointChargeComp 와같이 모델로 넘기는데여

이런방식으로 모든 소스가 되어있는데 마우스로 빠르게 따닥하고 클릭하면

쿼리가 두번실행되는거 같습니다.

재빠르게하면 세번까지도 쿼리가 실행될수도 -_-;;

이런적이 예전에는 한번있어도 대수롭지 않게 생각했는데

 점수자체가 두배로 쌓인다고 생각하니 큰문제가 아니라고 볼수밖에 없네요.

이부분이 현금이라고 생각하면 더 문제일거같네여

지금 거의가 ajax를 사용할텐데 어떻게들 보시나요?

 

 

 

 

 

 

 

 

 다음글 redirect 뒤에 붙는 쓰레기 값 붙는문제 (2)
 이전글 CI에서 PDO 사용법 (17)

댓글

kaido / 2016/05/17 11:58:50 / 추천 1

오류 아닙니다. 오류라 함은 설계한 것과 다르게 작동 할때 오류죠.

ajax 의 특성상 리턴 받기전에 요청을 더 받아서 작동한 것 뿐이죠.

 

ajax 옵션에 동기화 옵션 async: true 설정해 주세요.

그리고 2번이 연속으로 눌리지 않도록 스크립트 보완을 강화 하시면 해결 될 문제로 보입니다.

 

 

한대승(불의회상) / 2016/05/17 12:10:42 / 추천 0

비동기 방식이라 연속으로 마우스 클릭 횟수 만큼 호출 되는것이 정상 입니다.

kaido님이 제시 한 것처럼 설정을 동기 방식으로 바꿔 주거나 마우스 클릭이 있었는지 점검 하는 로직을 추가 하세요.

톰소여 / 2016/05/17 12:17:07 / 추천 1

버그라고 생각했는데 버그가 아니군요...

이런것에서 제가 아직 하수라고 느껴지네요. ㅎㅎ

카이도님이 말하신 옵션 주는 부분은 제이쿼리 소스자체가 달라져서

 

$(document).ajaxStart(function(e) {

window.ajaxCheck = 1;

});

 

$(document).ajaxStop(function(e) { 

window.ajaxCheck = null; 

});

 

$('.chargebtn').on('click', function(e){

if( window.ajaxCheck == 1 ) return false;

...실행할 JS...

});

 

위와같이 처리했습니다. 위와같이해도 해결되더군여.

다른분의 도움을 받았습니다.

해결방법은 여러가지가 되는군요.

그냥 location.href=''; 방식으로 하려다가 위방식으로 처리했습니다.