제목 | 제가 연구한 ajax json관련 소스인데 별로 안좋을 수 있지만 공개합니다. | ||
---|---|---|---|
글쓴이 | 닉 | 작성시각 | 2016/01/13 16:58:48 |
|
|||
function alert_msg (msg) { //alert(msg); $(".design_alert .msg").html(msg.replace(/\n/g, "<br />")); //$(".design_alert").fadeIn().delay(3000).fadeOut(); $(".design_alert").show(0).delay(3000).hide(0); } var ajaxJsonBool = true; //ajax가 실행되는지, var ajaxJsonDelay = 50; //ajax가 실행중이면 재 요청할 시간 /** * ajax json * @param action string url * @param data array * @param $el 엘리먼트 (jquery element obj) * @param successFn success callback * @param loading 엘리먼트 (jquery element obj) * @param errorFn error callback * @param timeout micro second * */ function ajaxJson (action,data,$el,successFn,loading,errorFn,timeout) { if(ajaxJsonBool){ if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").show(); } else { loading.show(); } } ajaxJsonBool = false; var ajaxTimeOut = 5000; if ( timeout !== undefined ) { ajaxTimeOut = timeout; } var setting = { url : action, type : 'post', timeout : ajaxTimeOut, dataType : 'json', data : data, success : function(returnData){ if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").fadeOut(); } else { loading.fadeOut(); } } //만약 메세지가 정의되었으면.. if ( returnData.msg !== undefined ) { //alert(returnData.msg); alert_msg(returnData.msg); } //만약 리턴된 html이 정의되었으면.. if ( returnData.returnHtml !== undefined ) { $el.html(returnData.returnHtml); } //만약 타입이 함수면... if ( typeof ( successFn ) == "function" ){ successFn(returnData); } setTimeout(function(){ajaxJsonBool = true;},ajaxJsonDelay); }, error : function(jqXHR, textStatus, errorThrown){ if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").fadeOut(); } else { loading.fadeOut(); } } if ( typeof ( errorFn ) == "function" ){ errorFn(jqXHR, textStatus, errorThrown); } else { alert_msg( ajaxJsonError(jqXHR, textStatus, errorThrown) ); } ajaxJsonBool = true; } }; /* if ( addSetJson !== undefined ) { var obj = jQuery.parseJSON(addSetJson); for (var i in obj) { eval("setting." + i + " = " + obj[i] + ";"); } } */ $.ajax(setting); }else{ setTimeout(function(){ ajaxJson (action,data,$el,successFn,loading,errorFn,timeout); },ajaxJsonDelay); } } function ajaxJsonError(jqXHR, textStatus, errorThrown) { var err_msg = ''; if (jqXHR.status === 0) { err_msg = '네트워크가 오프라인입니다.\n네트워크를확인하시기 바랍니다.'; } else if (jqXHR.status == 404) { err_msg = '요청 된 페이지를 찾을 수 없습니다. [404]'; } else if (jqXHR.status == 500) { err_msg = '내부 서버 오류. [500]'; } else if (textStatus === 'parsererror') { err_msg = '요청 된 JSON 구문 분석에 실패했습니다.'; } else if (textStatus === 'timeout') { err_msg = '시간 초과 오류가 발생했습니다.'; } else if (textStatus === 'abort') { err_msg = 'Ajax 요청이 중단되었습니다.'; } else { err_msg = 'Uncaught Error.\n' + jqXHR.responseText; } return err_msg; }
//실 사용 코드 function priceBatchSubmit (no) { var f = $("form.priceBatch"); var action = f.attr('action'); var action = '/' + mgf + '/air/comUpdate'; var data = new Array(); data = f.serializeArray(); data.push({ name: csrf_name, value: csrf_hash }); ajaxJson(action,data,undefined,function(){ createPromotionCal(no); },$("dl.calControl .loading2")); }
//php 코드 //객실 가격 달력폼 function roomInfoPriceForm ($roomNo) { $this->layout = 'default'; //아작스 호출인지 if ( $this->input->is_ajax_request() ) { $returnHtml = $this->stay_model->roomInfoPriceFormCal( $roomNo, $this->input->post("y"), $this->input->post("m") ); json_alert( array( 'returnHtml' => $returnHtml ) ); } else { alert('잘못된 접근입니다.'); } } // ajax json echo and exit function json_alert($msg='') { echo json_encode($msg); exit; }
//응용... /객실 달력 서브밋 function roomCalSubmit() { $this->layout = 'default'; //아작스 호출인지 if ( $this->input->is_ajax_request() ) { $this->load->library('form_validation'); $config = array( array('field'=>'dPrice[]', 'label'=>'판매가', 'rules'=>'trim|xss_clean'), array('field'=>'rPrice[]', 'label'=>'입금가', 'rules'=>'trim|xss_clean'), array('field'=>'year', 'label'=>'연', 'rules'=>'required|trim|xss_clean'), array('field'=>'month', 'label'=>'월', 'rules'=>'required|trim|xss_clean'), array('field'=>'rm_no', 'label'=>'prkey', 'rules'=>'required|trim|xss_clean|is_natural'), ); $this->form_validation->set_rules($config); //폼검증. if ($this->form_validation->run() == FALSE) { if( validation_errors() ){ json_alert( array( 'stat' => 0, 'msg' => strip_tags(validation_errors()) ) ); } } else { $no = $this->input->post('rm_no'); $year = $this->input->post('year'); $month = $this->input->post('month'); //공유데이터면서 공유업체가가 아니면.. if ( ! $this->sc_cm_no && $this->tmp_ta_cm_no != 'share' ) { // } else { $this->stay_model->roomCalSubmit(); } json_alert(array( 'stat' => 2, 'msg'=>'등록되었습니다.','no' => $no,'year' => $year,'month' => $month )); } } else { alert('잘못된 접근입니다.'); } }
|
|||
다음글 | 푸시불렛 푸시 발송 (14) | ||
이전글 | php 7.0.1 업데이트 (centos6, yum) (15) | ||
한대승(불의회상)
/
2016/01/13 17:43:50 /
추천
0
|
닉
/
2016/01/13 18:15:18 /
추천
0
//불의회상 올려놓고 보니 장황하네요. 제 프로젝트에 쓸라고 만들었는데, 도움이 될까하고 올렸습니다. |
kaido
/
2016/01/14 09:26:44 /
추천
0
좋은 정보 감사 합니다. 여기에 프로미스 패턴까지 들어가 있으면 금상 첨화가 될것 같습니다. |
닉
/
2016/01/14 12:39:24 /
추천
0
//kaido 그렇군요.. 문제가 있다곤 생각했는데, 힌트를 얻었습니다. 공부좀 해서 또 올릴게요 .. |
kaido
/
2016/01/14 14:00:08 /
추천
0
@닉 아니요 ㅎㅎ 프로미스 패턴 까지 요구되는 경우는 드문 케이스 입니다. 다만 언젠가 한번 요구를 해오는 경우가 있어요. |
닉
/
2016/01/27 17:57:33 /
추천
0
@kaido
/** * ajax json * @param action string url * @param data array * @param $el 엘리먼트 (jquery element obj) * @param successFn success callback * @param loading 엘리먼트 (jquery element obj) * @param errorFn error callback * @param timeout micro second * */ function ajaxJson (action,data,$el,successFn,loading,errorFn,timeout) { if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").show(); } else { loading.show(); } } var ajaxTimeOut = 5000; if ( timeout !== undefined ) { ajaxTimeOut = timeout; } var setting = { url : action, type : 'post', async: false, timeout : ajaxTimeOut, dataType : 'json', data : data, success : function(returnData){ if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").fadeOut(); } else { loading.fadeOut(); } } //만약 메세지가 정의되었으면.. if ( returnData.msg !== undefined ) { //alert(returnData.msg); alert_msg(returnData.msg); } //만약 리턴된 html이 정의되었으면.. if ( returnData.returnHtml !== undefined ) { $el.html(returnData.returnHtml); } //만약 타입이 함수면... if ( typeof ( successFn ) == "function" ){ successFn(returnData); } }, error : function(jqXHR, textStatus, errorThrown){ if ( loading !== undefined ) { if ( loading == 1 ) { $(".loading").fadeOut(); } else { loading.fadeOut(); } } if ( typeof ( errorFn ) == "function" ){ errorFn(jqXHR, textStatus, errorThrown); } else { alert_msg( ajaxJsonError(jqXHR, textStatus, errorThrown) ); } } }; return $.ajax(setting); } //이름등 저장 function reservBasicForm () { var action = '/reserv/reservBasicForm'; var data = new Array(); data.push({ name: csrf_name, value: csrf_hash }); var basic = ajaxJson(action,data,undefined,function(doc){ alert(1); }); return basic; }; //항공저장 function reservAirForm (f,allBt) { var action = '/reserv/reservAirForm'; var data = new Array(); data = f.serializeArray(); data.push({ name: csrf_name, value: csrf_hash }); var air = ajaxJson(action,data,undefined,function(data){ alert(2); }); return air; }; //숙소저장 function reservStayForm (f,allBt) { var action = '/reserv/reservStayForm'; var data = new Array(); data = f.serializeArray(); data.push({ name: csrf_name, value: csrf_hash }); var stay = ajaxJson(action,data,undefined,function(data){ alert(3) }); return stay; }; //모두저장 $('.rsv_sv').click(function(){ var XHRs = []; XHRs.push(reservBasicForm()); $(".reservAirForm").each(function(i,el){ XHRs.push(reservAirForm($(el))); }); $(".reservStayForm").each(function(i,el){ XHRs.push(reservStayForm($(el))); }); $.when.apply(undefined, XHRs).then(function () { alert(4); },function(){ alert('실패'); }); return false; });
바뀐점... settimeout 대신 async: false, 옵션 추가. 마지막에 retrun문이 들어갑니다.. async: false, << 은 동기로 실행되게 하는 옵션...
|
좋은 정보 감사 합니다. ^^