반응형

ajax 통신은 비동기식 통신입니다.

onsubmit 이벤트에서 ajax 통신을 할 때, ajax 통신 결과와는 상관없이 submit 처리를 합니다.

그래서 async: false 와 event.preventDefault(); 로 처리를 할 수 있습니다.

이렇게 하게 하면 ajax 통신 결과 리턴 시간이 지연 될 것을 감안하여 올리는 로딩바가 구현이 되지 않습니다.

이 경우에는 로딩바를 먼저 노출되도록 처리를 하고 ajax 통신을 setTimeout과 결합하여 사용하면 로딩바가 나오게 됩니다.

최종적으로 ajax 통신 결과가 성공 일 때 submit이 안되는 현상이 발생을 하였습니다.

이 현상의 해법은 $.when($.ajax()).done().fail()과 currentTarget.submit()입니다.

며칠 동안 포스팅 했던 내용의 완결판입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <form name="theForm" action="" method="post" id="theForm">
    <input type="submit" />
  </form>

<script>
  $('#theForm').submit(function(event){
  
	// 자동 submit을 시키는 것을 막는다.
	event.preventDefault();

    /**
     * 입력 필드 validattion check 로직
     */
  

    /**
     * ajax로 다른 페이지를 처리 후에 결과가 성공일 때 전송 처리를 한다.
     */

    // ajax 통신을 설정합니다.
     var when =
   		$.ajax({
   			url:'[주소]',
   			type:'post',
   			data:$('form').serialize(),
   			dataType:'json'
   		});

      // 로딩바를 보여 준다.
    	$('#loadimg').css('display','block');
      
      $.when(when)
    	.done(function(data)
    	{
    		var message = data.message;
    		if ( message == 'Success' )
    		{
    			//console.log('success');
          // 성공일 때 form submit을 합니다.
    			event.currentTarget.submit();
    		}
    		else
    		{
    			// 안내 메시지를 보여준다.
    			alert('안내 메시지');
    			// 에러가 발생하면 모달창을 닫는다.
    			$('#모달창 id').modal('hide');
    		}
    	})
    	.fail(function(request, status, error)
    	{
        // 통신 실패하였을 때
    		console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
    
    		// 안내 메시지를 보여준다.
    		alert('안내 메시지');
    		// 에러가 발생하면 모달창을 닫는다.
    		$('#모달창 id').modal('hide');
    	})
    	.always(function (data, status, responseObj)
    	{
        // 성공 실패와 상관 없이 항상 처리를 하는 내용을 담습니다.
    		//console.log(data);
    
    		// 로딩바를 해제한다.
    		$('#loadimg').css('display','none');
    	});
    
    })
  </script>
  
</body>
</html>

Javascript ajax 동기식으로 처리 후 jquery submit 처리하기

2020/03/05 - [유용한 활용팁] - Javascript ajax async: false (동기식) 처리 시 로딩바 구현 방법.

 

Javascript ajax async: false (동기식) 처리 시 로딩바 구현 방법

ajax를 동기식( async: false )으로 구현할 경우 beforeSend:function()의 로딩바가 구현이 되지 않습니다. 통신의 결과가 나오지 않아서 아래까지 내려가지 않는 현상으로 보입니다. 시간이 지연되는 서비스의 경..

han288.tistory.com

2020/03/04 - [유용한 활용팁] - Javascript jquery submit 이벤트 시 submit 제어하기

 

Javascript jquery submit 이벤트 시 submit 제어하기

지난 시간 Form onsubmit 이벤트 시 isSubmit 플래그를 이용하여 submit을 제어하는 방법을 언급하였습니다. 결론부터 얘기를 하면 ajax 통신이 성공이었을 때, 추가 작업을 진행하지 못하고 submit이 되는 버그를..

han288.tistory.com

2020/03/03 - [유용한 활용팁] - Javascript Form onsubmit 이벤트 시 ajax 결과에 따라서 전송 처리하기 - async: false

 

Javascript Form onsubmit 이벤트 시 ajax 결과에 따라서 전송 처리하기 - async: false

Form에서 onsubmit 이벤트를 사용할 때 Javascript로 ajax 결과에 따라서 전송 처리하는 방법입니다. 1. ajax 설정 값 중 async를 false로 설정합니다. - async: false 는 동기식 즉 절차적으로 처리를 한다는 의..

han288.tistory.com

 

반응형

+ Recent posts