001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
// (2022.9.9, 차재복, Cha Jae Bok, http://www.ktword.co.kr) // 숨기기/보이기 toggle function itemShowHide(target, btn='') { if (getComputedStyle(target,null).display == "none") { target.style.display = "block"; if(btn) if (btn.nodeName=='BUTTON' || btn.nodeName=='A') btn.innerHTML = btn.innerText.replace('∨','∧'); // btn.innerHTML = btn.innerText.replace('펼치기','접기'); } else { target.style.display = "none"; if(btn) if (btn.nodeName=='BUTTON' || btn.nodeName=='A') btn.innerHTML = btn.innerText.replace('∧','∨'); // btn.innerHTML = btn.innerText.replace('접기','펼치기'); } } // 자바스크립트에서, insertAfter 구현 // ([참고] https://blog.asamaru.net/2016/12/06/how-to-do-insertafter-in-javascript/) function insertAfter(referenceNode, newNode) { if (!!referenceNode.nextSibling) { return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); } else { return referenceNode.parentNode.appendChild(newNode); } } // 비동기 xhr 실행으로, 서버 데이터 가져오고, 이를 sessionStorage에 저장 function asyncProcess(id, type) { return new Promise( (resolve, reject) => { let xhr = new XMLHttpRequest(); let choice; if(type=='each') choice = 'ol'; else if(type=='auto') choice = 'all_ol'; let method = 'GET'; let url = '../reform/reform_item.php?ch='+choice+'&id='+id; xhr.open(method, url); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // if (glob_var.user_type > 0) alert('id='+id+', all_data_store ajax 함수 호출됨'); var data = JSON.parse(xhr.responseText); if (data == null) return; // console.log(xhr.responseText); var cur; for (var parent in data ) { var sid = 'sid_'+parent; // sessionStorage 내 id 식별 var storage = JSON.stringify(data[parent]); sessionStorage.setItem(sid, storage); if(parent==id) current = data[parent]; } // resolve(성공) 수행 if (sessionStorage[sid]) resolve(current); // reject(실패) 수행 else reject('asyncProcess 실패'); } }; xhr.send(); }); } // 보다 일반화된 ajax promise 실행 function ajaxPromise (url, method, parms) { // url, method 'get'/'post', parms {'formData':'...','textOnly':true/false} return new Promise ( (resolve,reject) => { let xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 디버깅용 // console.log(xhr.responseText); // promise resolve(성공) 수행 if (xhr.responseText) { // 결과 텍스트 그대로 출력을 원할 때 if (parms && parms.textOnly) resolve(xhr.responseText); // 결과 텍스트에 대한 JSON parse를 원할 때 else { try { let resultObj = JSON.parse(xhr.responseText); resolve(resultObj); } catch (e) { alert(xhr.responseText + ' : JSON 포멧 아닌듯함'); console.log(e.message); } } // promise reject(실패) 수행 } else { reject('ajaxPromise 실패 (서버로부터 빈 결과) : console.log 확인 필요'); // 에러 관련 로그를 웹브라우저 콘솔에 기록 console.log(url); console.log(parms); } } }; // ajax 호출용 쿼리 파라미터 if (method=='post') { // FormData 형식이 아닌 경우 : HTTP 헤더 mime 타입 지정 if (!parms.formData && !parms.json) { xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); let sendData = ''; for (const property in parms) { sendData += property + '=' + encodeURIComponent(parms[property]) + '&'; } xhr.send(sendData); // 일상적인 FormData 형식인 경우 } else if (parms.formData && !parms.json) { xhr.send(parms.formData); // JSON 형식인 경우에, HTTP 헤더 mime 타입 지정하고, JSON 포멧 스트링으로 정보 송출 } else if (!parms.formData && parms.json) { xhr.setRequestHeader('Content-Type','application/json'); const sendData = JSON.stringify(parms.obj); xhr.send(sendData); } } else if (method=='get') { xhr.send(); } }); } // 외부 javascript 코드 불러와서 삽입 실행 // ([참고] https://asfirstalways.tistory.com/236) function includeJS(jsFilePath, id_name) { let js = document.createElement('script'); js.type = 'text/javascript'; // 캐싱 방지 : '?dt='+dateString' (일 단위 캐시) const date = new Date(); const year = date.getFullYear(); const month = new String(date.getMonth()+1); const day = new String(date.getDate()); const hour = new String(date.getHours()); urlDateQuery = '?dt='+ year+month+day+hour; js.src = jsFilePath + urlDateQuery; if(name) js.id = id_name; return document.body.appendChild(js); } // 한글 처리 (1) (참고문헌 : https://dev.uhoon.co.kr/entry/한글-포함-문자열-바이트로-자르기-substring [Dev 저장소:티스토리]) function getTextLength4Hangul(str) { let len = 0; for (let i = 0; i < str.length; i++) { if (escape(str.charAt(i)).length == 6) { len++; } len++; } return len; } // 한글 처리 (2) function cutStr4Hangul(str, start, size) { // size : 바이트수 let i = 0; let lim = 0; let pos = 0; let beg = 0; let minus = 0; let len = getTextLength4Hangul(str); for (let i = 0; pos < start; i++) { pos += (str.charCodeAt(i) > 128) ? 2 : 1; } beg = i; for (i = beg; i < len; i++) { lim += (str.charCodeAt(i) > 128) ? 2 : 1; if (lim > size) { break; } } return str.substring(beg, i); } // fadeIn, fadeOut 구현 function fadeIn(target) { let level = 0; let inTimer = setInterval( function() { level = fadeInAction(target, level, inTimer); }, 35); } function fadeInAction(target, level, inTimer) { level = level + 0.05; target.style.opacity = level; if(level > 1 ) clearInterval(inTimer); return level; } function fadeOut(target) { let level = 1; let outTimer = setInterval( function() { level = fadeOutAction(target, level, outTimer); }, 35); } function fadeOutAction(target, level, outTimer) { level = level - 0.05; target.style.opacity = level; if(level < 0) clearInterval(outTimer); return level; }