여러곳에서 구글링하면서 코드를 보는거보다 로직을보고 코드를 짜는게 편할거같아서 쭉 보니

큰 로직은

1. 스크롤시 html에 append하기전 태그 코드를 세션스토리지에 담고

2. 상세 페이지 이동시 스크롤 높이를 다른 세션스토리지에 담고

3. 상세페이지에서 스크롤 페이지로 돌아갔을때 세션스토리지에 조회하고 조회한 세션스토리지가 있으면 불러와서 html에 추가하는 것이다

 

여기에서 좀 더 추가된 부분이 스크롤 페이지에 검색조건이 있는 경우이다 당연히 다른 검색식으로 페이지를 조회했을때는 다른 리스트를 보여주기 때문에 이전에 담았던 세션스토리지를 비워야한다

 

그렇다면 로직을 다시 수정해서

1. 스크롤시 코드와 스크롤 페이지네이션 정보를 담고  +스크롤시 담았던 데이터의 구분 정보인 현재 url을 담는다

2. 상세 페이지 이동시 스크롤 높이를 담고

3. 상세페이지에서 스크롤 페이지로 돌아갔을때 현재URL과 담았던URL을 비교한다

4. 같으면 스토리지 데이터를 append하고 스크롤시 불러올 url을 수정한다 아니면 스토리지를 전체 비운다

5. 추가되면 스크롤 위치를 내린다

 

 

1.

function 스크롤시불러올함수(result) {
 
     var htmlTag = "";
     htmlTag += '더보기시 추가할 태그정보';

    addListSessionStorage('저장할리스트이름', '더보기url이름', htmlTag, result['다음에불러올리스트url']);

    $('#추가할리스트').append(htmlTag);
    $('#더보기').attr("data-url", result['다음에불러올리스트url']);
 
}
function addListSessionStorage(Listname, urlName, htmlTag, UrlData) {
    if (sessionStorage.getItem(Listname)) {
        let listData = sessionStorage.getItem(Listname);
        listDataHtmlTag = listData + htmlTag;
        sessionStorage.setItem(Listname, listDataHtmlTag);
        sessionStorage.setItem(urlName, UrlData);

    } else {
        sessionStorage.setItem(Listname, htmlTag);
        sessionStorage.setItem(urlName, UrlData);

    }
}

 

checkNowPageSessionStorage(); // 위치: 스크롤 페이지
 
function checkNowPageSessionStorage() {
    if (sessionStorage.getItem("nowUrl")) {
        if (sessionStorage.getItem("nowUrl") == window.location.href) {
        } else {
            sessionStorage.clear();
            sessionStorage.setItem("nowUrl", window.location.href);
        }
    } else {
        sessionStorage.setItem("nowUrl", window.location.href);
    }
}

2. 

// 위치: 스크롤 페이지    
    $('body').on('click', '.startStorage', function(e) {
                            let docHeight = document.documentElement.scrollTop;
                            sessionStorage.setItem("높이", docHeight);
                        });

 

3. 

checkNowPageSessionStorage(); // 비교도하고 현재페이지를 담는다 위치: 스크롤 페이지

4.

getScrollpaginationSessionStorage('높이', '저장할리스트이름', '더보기url이름', '추가할리스트'); // 위치 : 스크롤 페이지
 
function getScrollpaginationSessionStorage(heightName, ListName, UrlName, appendName) {

    if (sessionStorage.getItem(UrlName)) {
        let listData = sessionStorage.getItem(ListName);
        let docHeight = sessionStorage.getItem(heightName);
        $('#' + appendName).append(listData);

        let nextUrl = sessionStorage.getItem(UrlName);
        $('#더보기').attr("data-url", nextUrl);
        window.scrollTo(0, docHeight);

    } else {
        // sessionStorage.clear();
        window.scrollTo(0,0);
    }

}

++ sessionStorage.clear(); 를 통해 세션 스토리지를 관리하고자했는데 이곳저곳에서 세션 스토리지를 날려대다보니 세션스토리지끼리 꼬이는 현상을 경험했다. 해당 코드는 관리하기 쉽게 특정 한곳에서만 초기화를 시켜주는것이 좋았다

  웹이든 모바일이든 사용자가 현재 보고있는 화면이 모달인지 아니면 페이지인지

확실하게 인지하는 것이 가장 좋지만 때로는 모달을 사용하여 상세 페이지를 보여주어야 할 때가 있다 

 

그럴때는 사용자가 모달로 인식하지않고 당연히 페이지가 새로 이동되었다고 경험하고

안드로이드 유저라면 하단의 뒤로가기 버튼을

아이폰 유저라면 좌측상단의 뒤로가기 버튼또는 웹에서 뒤로가기 버튼을

PC유저라면 뒤로가기 모션 또는 페이지 뒤로가기를 

누를것이다.

 

이렇게 되면 사용자의 의도는 페이지가 한번 뒤로가기를 원했지만

두번 뒤로간 경험을 하고 해당 사이트에 ?를 띄울것이다.

친절한 사용자는 사실 페이지는 한번 뒤로갔다는 것을 모르고 뒤로가기시 페이지가 두번 뒤로간다고

고객센터에 문의를 남길것이다.

이러한 경험이 쌓이고 쌓일수록 사용자는 불편을 겪게되고

뒤로가기시 두번뒤로가지는 이상한 사이트가 되어버린다.

 

모달에 대해서 구글링을 하다가 모달 표준권장 같은 글을 본적이 있는데 모달자체가 페이지 이동하는 것이 아니라서

모달을 화면 전체에 띄워서 사용하는것은 사용자 경험을 망치기 때문에 사용을 권장하지 않고있다.

하지만 모달을 페이지처럼 띄워야하는 상황인데 권장사항이 중요한가?

 

그럼 사용자 경험을 망치지 않으면된다.  

코드를 설명하자면 뒤로가기 이벤트를 잡고 거기에서 뒤로가기시 페이지를 뒤로가지 않고 모달을 닫는 로직을 넣으면된다

 


        // 뒤로가기시 모달닫기
        history.pushState(null, null, location.href);
        window.onpopstate = function(event) {
         
            // 여기에 모달을 닫는 로직을 담으면 된다
 
            $('body').css("overflow", "");
        };

 


// 1. 상위 제어 체크박스가 있다
// 2. 상위 제어에 따라 전체 선택 해제가 되는 하위체크박스 그룹이 있다
// (각 상위 체크박스는 하나의 하위체크박스 그룹이 있음)
// 3. 하위 체크박스의 선택에 따라 상위 체크박스를 변경한다
// 예시 상위 체크박스에는 포유류, 조류가 있고
// 포유류에는 [ 원숭이, 사자, 호랑이, 표범, 코끼리, 기린 ] 이있다
// 조류에는 [ 닭, 벌새, 까치, 까마귀, 참새, 비둘기 ] 가 있다
// 1. 여기서 원숭이를 선택하면 포유류와 원숭이가 선택되고 사자를 선택하면 사자가 선택된다
// 다른 항목인 닭을 선택하게 되면 포유류, 원숭이, 사자에 체크가 해제되고 조류, 닭이 선택된다
// 2. 원숭이, 사자, 호랑이를 선택하면 포유류, 원숭이, 사자, 호랑이에 선택되고
// 여기서 조류를 선택하면 이전의 포유류 선택이 해제되고 조류가 선택된다
// 이러한 구조를 지닌 로직을 만들어보자


// 상위 체크박스에 실행한다
function checkbox1 (otherName, otherAll) {
    let checkboxes = document.querySelectorAll(`input[name="${otherName}"]`);
    document.getElementById(otherAll).checked = false;

    checkboxes.forEach((checkbox) => {
        checkbox.checked = false;
    });
}

// 하위 체크박스에 실행한다
function checkbox2 (otherName, usAll, otherAll) {
    let checkboxes = document.querySelectorAll(`input[name="${otherName}"]`);
    document.getElementById(usAll).checked = true;

    if(document.getElementById(otherAll).checked){

        document.getElementById(otherAll).checked = false;
        checkboxes.forEach((checkbox) => {
            checkbox.checked = false;
        });
    }
}

 

먼저 로직을 생각해보자

어떤 버튼을 누르면 조회한 데이터를 html 요소에 담아서 추가한다

 

좀 더 깊게 생각해보자

버튼을 누르면 ajax 통신으로 데이터 요청을 전송하고 들고오는데 성공하면 데이터를 그려주는 함수에 뿌린다

 

코드로 보자

 

1.

$('body').on('click', '#버튼1', function(e) {

    ajax요청(ajax데이터요청주소, 요청할함수명);

});

클릭했을때 ajax 통신을 요청한다

 

2.

function ajax요청(데이터요청주소, 보낼함수명) {

    $.ajax({
        type: "POST",
        url: 데이터요청주소,
        data: "",
        dataType: "json",
        success: function (result) {
            보낼함수명(result);
        }
        , complete: function () {
          loadingEnd();
        }
        , error: function (xhr, status, error) {
            alert("error : " + error);
        }
    });
}
성공시에 성공한 값들을 함수명에 보낸다
데이터 요청 주소는 컨트롤러/함수?get을 사용해서 주소를 던지고 컨트롤러 내부에서 조회한 데이터를
json_encode 함수로 인코드 해서 리턴한다
 
3.
function 보낼함수명(result) {

    var htmlTag = "";
    let base_url = result['base_url'];

    $.each(result['데이터배열'], function (key, value) {

        htmlTag += `<태그 생성>${value['키값']}</태그 생성>`;
        htmlTag += `<태그 생성>${value['키값']}</태그 생성>`;
    });

    $('#추가할위치').append(htmlTag);
    $('#버튼1').attr("data-url", result['다음리스트URL']);
    $('#버튼1').attr('disabled', false);
}
each문을 돌면서 htmlTag에 배열의 길이만큼 반복해서 담고 append를 통해서 html에 추가한다

 

아주 간단하게 받은 문자열이 http://또는 https://로 시작하는지 체크만 해준다

function checkUrl(urlData) {
    let Url = /^http[s]?\:\/\//i;
    let resultUrl = Url.test(urlData);
   
    return resultUrl;
}

ajax 통신중에 사용자의 확인을 한번더 물어보는 상황이 반드시 생긴다

예를들어 삭제할때

 

만들어두고 사용할때 예

let arrData = { 키: ,
    키 :  }
let postUrl = "컨트롤러 함수"
let successUrl = "성공시 이동 경로"

ajaxFormConfirm_base("삭제하시겠습니까?", postUrl, arrData, successUrl, "삭제에 실패했습니다.");

 

함수부분

// 메시지, 컨트롤러함수, 데이터, 성공시주소, 실패시문구
function ajaxFormConfirm_base(congirmMessge, postUrl, arrData, successUrl, errorMessage) {
    if (confirm(congirmMessge)) {

        $.ajax({
            url : postUrl,
            type : "POST",
            data : arrData,
            success : function(res){
                location.href = successUrl;
            },
            error: function(error){
                alert(errorMessage);
            },

        })
    }
}

 

+ Recent posts