티스토리 뷰
페이징이 되어있는 게시판에서 1페이지에서 체크했던 값들이 2페이지에 갔다가 다시 1페이지로 돌아와도 체크된 상태로 남아있도록 하는 로직을 고객이 아닌 PM이 요구하여 만들게 됐다. 체크박스 체크 상태가 유지되는 게시판을 여태 본 적도 없고, 이용하는 사람 입장에서도 왜 그렇게 해야 하는지는 모르겠으나.. 만들라고 하니까 만들었다.
처음엔 체크할 때마다 ajax처리해서 session으로 들고다닐까 하다가, 겨우 체크박스 하나 때문에 불필요한 서버-클라이언트 통신이 발생하는 것도 아닐 뿐더러 띄엄띄엄 하는 체크에 많은 양의 체크를 할 것 같지도 않아서 그냥 쿠키로 해결하기로 했다.
좀더 정리가 필요한 소스이긴 하지만, 더이상은 귀찮다. ㅡ.ㅡ;;
Javascript단
var cookieName = "item"; var splitStr = "/"; $(document).ready(function(e){ // 이전에 체크됐던 아이템들을 체크해준다. checkChkCookie(cookieName, "/", "chkValue"); var checkedCnt = getChkCookieCnt(cookieName, "/", "chkValue"); if(checkedCnt > 0){ // 체크될 때마다 그 개수를 버튼명에 집어넣거나.. //$("#btn").text("선택(" +checkedCnt + "개) 저장"); }else{ // 체크한 아이템이 없을 경우 다시 버튼명 변경.. //$("#btn").text("선택한 것 없음"); } // 신규 체크가 발생할 경우 실행. chkBoxCookie(cookieName, "/", "allCheck", "chk", "chk", "chkValue", "changeMigBtnName"); }); function checkAll(flag) { if(flag) { $("input[type=checkbox]").prop("checked", true); }else{ $("input[type=checkbox]").prop("checked", false); $("#chkValue").val(""); //$("#btn").text("선택한 것 없음"); // 쿠키 삭제 deleteCookie(cookieName); } } /** * 체크박스 체크 후 페이지를 이동해도 이전에 체크했던 기록이 남아있도록. * @param cookieName : 저장할 쿠키명 * @param splitStr : 구분자 ex) "/" * @param chkAllId : 전체체크 체크박스 id * @param chkName : 목록 체크박스 name * @param chkClassName : 목록 체크박스 classname * @param basketId : 체크된 쿠키값을 들고 있을 input hidden id * @param funcName : 체크박스 동작 수행 후, 실행되어야 할 함수명 * @returns */ function chkBoxCookie(cookieName, splitStr, chkAllId, chkName, chkClassName, basketId, funcName){ $("#"+chkAllId).click(function(){ // 만약 전체 선택 체크박스가 체크된 상태일 경우 if($("#"+chkAllId).prop("checked")) { // 화면 전체 checkbox들을 체크해준다 $("input[type=checkbox]").prop("checked", true); var isExistOldCookie = false; var oldCookie = getCookie(cookieName); if(oldCookie != "") isExistOldCookie = true; var chkValue = ""; if(isExistOldCookie){ chkValue = oldCookie; var oldCookieArray = oldCookie.split(splitStr); $("." + chkClassName + ":checked").each(function(i) { for (var i = 0; i < oldCookieArray.length; i++) { var checkedValue = $(this).val(); // 체크되어 있는 값 var oldV = oldCookieArray[i]; // 기존 체크한 쿠키와 전체로 체크한 쿠키가 같지 않다면, if(oldCookieArray[i] != checkedValue && chkValue.indexOf(checkedValue) == -1){ chkValue += splitStr + checkedValue; } } }); }else{ // 기존 체크한 쿠키가 아예 없다면, $("." + chkClassName + ":checked").each(function(i) { var checkedValue = $(this).val(); // 체크되어 있는 값 var lastValue = $(".chk:checked:last").val(); if(lastValue == checkedValue){ chkValue += checkedValue; }else{ chkValue += checkedValue + splitStr; } }); } setCookie(cookieName, chkValue, null); // hidden에 값 넘기기 $("#" + basketId).val(chkValue); var chkValueArray = chkValue.split(splitStr); if(funcName != "") window[funcName](chkValueArray); // 버튼명 변경 } else { var oldCookie = getCookie(cookieName); var oldCookieArray = oldCookie.split(splitStr); $("." + chkClassName + ":checked").each(function(i) { var allValue = $(this).val(); // 체크되어있는 값 oldCookieArray = removeA(oldCookieArray, allValue); }); // 화면의 모든 checkbox들의 체크를 해제시킨다. $("input[type=checkbox]").prop("checked", false); var chkValue = oldCookieArray.join(splitStr); setCookie(cookieName, chkValue, null); // hidden에 값 넘기기 $("#" + basketId).val(chkValue); if(funcName != "") window[funcName](oldCookieArray); // 버튼명 변경 } }); $("input:checkbox[name='"+ chkName + "']").change(function(){ // 목록 체크박스에 변화가 있다면, var chkValue = $(this).val(); var oldCookie = getCookie(cookieName); if($("input:checkbox[id='" + chkValue + "']").is(":checked")){ // 체크했을 때, if(oldCookie != ""){ // 기존에 체크했던 쿠키가 있다면, chkValue = oldCookie + splitStr + chkValue; } setCookie(cookieName, chkValue, null); var chkValueArray = chkValue.split(splitStr); if(funcName != "") window[funcName](chkValueArray); // 버튼명 변경 }else{ // 체크 해제 시, var oldCookieArray = oldCookie.split(splitStr); for (var i = 0; i < oldCookieArray.length; i++) { if(oldCookieArray[i] == chkValue){ oldCookieArray.splice(i, 1); } } var oldCookieStr = oldCookieArray.join(splitStr); setCookie(cookieName, oldCookieStr, null); var chkValueArray = oldCookieStr.split(splitStr); if(funcName != "") window[funcName](chkValueArray); // 버튼명 변경 } // hidden에 값 넘기기 $("#" + basketId).val(chkValue); }); } function changeBtnName(valueArray){ var checkedCnt = valueArray.length; if(checkedCnt > 0){ //$("#btn").text("선택(" +checkedCnt + "개) 저장"); }else{ //$("#btn").text("선택한 것 없음"); } } /** * 체크된 쿠키 개수 반환 * @param cookieName * @param splitStr * @param basketId * @returns */ function getChkCookieCnt(cookieName, splitStr, basketId){ var cookiesStr = getCookie(cookieName); var checkedCnt = 0; if(cookiesStr != ""){ var cookieArray = cookiesStr.split(splitStr); checkedCnt = cookieArray.length; } return checkedCnt; } /** * 저장된 쿠키를 불러와서 체크박스 체크 * @param cookieName * @param splitStr * @param basketId * @returns */ function checkChkCookie(cookieName, splitStr, basketId){ var cookiesStr = getCookie(cookieName); $("#"+basketId).val(cookiesStr); if(cookiesStr != ""){ var cookieArray = cookiesStr.split(splitStr); for (var i = 0; i < cookieArray.length; i++) { $("input:checkbox[id='" + cookieArray[i] + "']").prop("checked", true); } } } function setCookie(cookieName, value, exdays){ var exdate = new Date(); exdate.setDate(exdate.getDate() + exdays); var cookieValue = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toGMTString()); document.cookie = cookieName + "=" + cookieValue; } function deleteCookie(cookieName){ var expireDate = new Date(); expireDate.setDate(expireDate.getDate() - 1); document.cookie = cookieName + "= " + "; expires=" + expireDate.toGMTString(); } function getCookie(cookieName) { cookieName = cookieName + '='; var cookieData = document.cookie; var start = cookieData.indexOf(cookieName); var cookieValue = ''; if(start != -1){ start += cookieName.length; var end = cookieData.indexOf(';', start); if(end == -1)end = cookieData.length; cookieValue = cookieData.substring(start, end); } return unescape(cookieValue); } /** * 배열에서 값으로 삭제하기 * @param arr * @returns */ function removeA(arr) { var what, a = arguments, L = a.length, ax; while (L > 1 && arr.length) { what = a[--L]; while ((ax = arr.indexOf(what)) !== -1) { arr.splice(ax, 1); } } return arr; }
JSP 화면단
'공장 (factory) > - Programming..' 카테고리의 다른 글
[eclipse] Remote System Explorer Operation 해제 (0) | 2019.10.23 |
---|---|
[MSSQL/Mybatis] Merge, insert/update 한 번에 처리하기. (0) | 2019.10.15 |
[Javascript/jQuery] 오늘 날짜/기간 반환 (2) | 2018.07.20 |
[Javascript/jQuery] 백스페이스 키 눌림 방지 (input, readOnly 제외) (0) | 2017.11.07 |
[JSP/Spring] Restful url-pattern (*.do 제외하기) (1) | 2017.06.21 |
댓글