매우 많은 데이터를 찾아보았는데
희한하게 잘 되지 않거나 2%씩 부족해서 쓸수없어 직접 만들었다.
window.onpopstate 와 addEventListener 는 동일한 URL에서 history.back 시에만 이벤트가 발생하고
게시글 보기 라는 다른 URL 을 갔다가 뒤로가기를 하면 발생하지 않아서 사용하지않는다.
대신 앵커를 적절히 조합하여 페이지에 처음왔을때랑 뒤로가기랑 구분할수 있도록 했다.
아마도 오래된 자료들이라 브라우저 업데이트로인해 안되는것 같았고
현재 크롬버전에서 잘 작동하는걸 확인하였다.
ajax를 사용하여 리스트를 추가해 무한스크롤 리스트를 구현했을경우 작동하는방법이다.
var curpage = 1; //현재페이지
var scrollchk = true; //스크롤 체크 여부 플래그
var totallist; //ajax로 받아온 list를 이 변수에 계속 누적시킴
var loadlist = function(){
var url = cb_url + '/board/lists/'+id;
$.ajax({
url : url,
type : 'get',
dataType : 'html',
success : function(list) {
if(list.length > 3){
curpage++; ///데이터를 받아오는데 성공했고 추가할 페이지가 있으면 현재 페이지를 늘려준다.
$('#lists').append(list); ///html에 받아온 리스트를 추가해주고
totallist += list; ///totallist에 차곡차곡 누적시켜준다.
history.replaceState({list:totallist, page:curpage},'Page '+curpage, 'board/list##'}); //이부분이 핵심인데 현재 페이지의 주소에 ## 이라는 앵커를 넣어줌으로서 이 페이지에 1회이상 페이지 로딩이 있었다는 표시를 해준다.
//replaceState라는것은 현재페이지 히스토리를 변경하는 함수이고
//pushState를 추가를 하는 함수인데 replaceState로 해야 현재 리스트에서 백스페이스시 뒤 페이지로 가기때문이다.
//중요한부분은 replaceState(데이터,타이틀,URL)에서 데이터부분인데 현재까지 계속 로딩해서 받아온 데이터를 저장시켜준다. 그리고 불러온 후 현재페이지도 세팅해야 하므로 현재 페이지도 데이터 부분에 넣어준다.
}
scrollchk = true; //데이터 로딩이 끝나면 스크롤체크를 풀어준다.
mutex = false; //데이터로딩이 끝나면 ajax접근권한을 준다(중복호출 방어)
}
});
}
$(window).scroll(function(){
if(scrollchk){ ///새로고침이나 뒤로가기시 스크롤이 밑으로가있으면 로딩체크를하며 알람메시지가뜨므로 페이지를 완전히 세팅후 스크롤체크를 하도록 방어처리
if($(window).scrollTop() >= $(document).height() - $(window).height()){
if(mutex){
alert('다음페이지를 로딩중입니다.');
return;
}
mutex = true;
loadlist();
}
}
});
if(location.hash){ //현재 주소에 ##이라는앵커가 박혀있을경우 true가 발생한다.
//앵커가 박혔다는것은 새 페이지 진입이아니라 한번이라도 로딩이 있었던 페이지이므로
//뒤로가기로 왔다는 뜻이된다.
var data = history.state; //아까 데이터로 보낸부분이 history.state에 저장이되어있다.
if(data){
scrollchk = false; //데이터를 세팅하는동안 스크롤 체크를 하지않게하자.
$('#lists').append(data.list); //저장된 데이터를 뿌려준다.
curpage = data.page; //저장되었던 마지막 페이지를 세팅
scrollchk = true; //데이터 세팅 종료 후 스크롤 체크
}
}
깔금고 빠르게 잘 작동한다.
정말 많은 페이지도 브라우저 메모리에 저장했다 복구하기때문에 속도도 매우좋다.
엄청 검색해보았지만 찾는사람은 많은데 구글님께서도 정확한 답을 주질 못해
검색해 얻은 몇가지를 조합해 직접 구현하게 되서 쿨하게 공유하게되었다. 이런.. 쿨남같으니.. ㅎㅎ
'정보 > IT&컴퓨터' 카테고리의 다른 글
| 라즈베리파이 서버구축 5번째 (마지막) Transmission, Kodi 설치 (0) | 2018.07.23 |
|---|---|
| 라즈베리파이 서버구축 4번째 APM(Apache2, PHP, MYSQL) 설치 (1) | 2018.07.23 |
| 라즈베리파이 서버구축 3번째 쌈바서버, FTP 설치 (0) | 2018.07.20 |
| 라즈베리파이 서버구축 2번째 계정추가/한글폰트/외장하드 마운트 (0) | 2018.07.17 |
| 극강의 가성비 34인치 144주사율 울트라 와이드 모니터 (0) | 2018.07.16 |