h5 기반 history 개선 ajax 목록 요청 체험
데이터 가 페이지 를 나 누 어 표시 하 는 가장 간단 한 방법 은 사이트 뒤에 여러 페이지 의 당 수 를 추가 하고'다음 페이지'를 누 를 때 페이지 를 페이지+1 의 새로운 주소 로 바 꾸 는 것 이다.예 를 들 어 시 나 닷 컴 의 뉴스 네트워크 는 이렇게 하 는 것 이다.인터넷 주 소 를 바 꾸 어 index1、index_2、index_3……。그러나 이 목록 이 페이지 의 주체 부분 이 아니 거나 페이지 의 다른 부분 에 많은 그림 등 풍부 한 요소 가 있다 면 예 를 들 어 네 비게 이 션 은 매우 큰 slider 이다.이런 방식 을 사용 하면 전체 페이지 가 심하게 반 짝 이 고 많은 자원 을 다시 불 러 와 야 한다.그래서 ajax 요청 을 사용 하여 DOM 을 동적 으로 변경 합 니 다.
그러나 일반적인 동적 요청 은 사이트 주 소 를 변화 시 키 지 않 습 니 다.사용자 가 다음 페이지 를 누 르 거나 몇 페이지 를 누 르 면 이전 페이지 로 돌아 가 려 고 할 때 브 라 우 저의 반환 키 를 누 를 수 있 습 니 다.그러면 원래 보 았 던 페이지 가 아니 라 이전 사이트 로 돌아 갈 수 있 습 니 다.예 를 들 어 중앙 방송국 의 뉴스 망 은 바로 이렇다.다음은 ajax 요청 부터 완전한 사례 로 분석 하 겠 습 니 다.
데모 하나 했 어 요.
우선,요청 을 하나 쓰 십시오.
//
var pageIndex = 0;
//
function makeRequest(pageIndex){
var request = new XMLHttpRequest();
request.onreadystatechange = stateChange;
// , ,
request.open("GET", "/getBook?page=" + pageIndex + "&limit=4", true);
request.send(null);
function stateChange(){
// 4, loaded,
if(request.readyState !== 4 ){
return;
}
//
if(request.status >= 200 && request.status < 300 || request.status === 304){
var books = JSON.parse(request.responseText);
renderPage(books);
}
}
}
데 이 터 를 받 은 후 렌 더 링:
function renderPage(books){
var bookHtml =
"<table>" +
" <tr>" +
" <th> </th>" +
" <th> </th>" +
" <th> </th>" +
" </tr>";
for(var i in books){
bookHtml +=
"<tr>" +
" <td>" + books[i].book_name + "</td>" +
" <td>" + books[i].author + "</td>" +
" <td>" + books[i].edition + "</td>" +
"</tr>";
}
bookHtml += "</table>";
bookHtml +=
"<button> </button>" +
"<button onclick='nextPage();'> </button>";
var section = document.createElement("section");
section.innerHtml = bookHtml;
document.getElementById("book").appendChild(section);
}
이러한 기본 적 인 ajax 요청 을 연결 한 다음"다음 페이지"단추 에 응답 합 니 다.
function nextPage(){
// index 1
pageIndex++;
//
makeRequest(pageIndex);
}
여기 서 아무런 처리 도 하지 않 으 면 브 라 우 저 복귀,전진 버튼 의 역할 을 발휘 할 수 없습니다.사용자 가 후퇴,전진 버튼 을 눌 렀 는 지 확인 할 수 있다 면 글 을 쓸 수 있 습 니 다.h5 는 이러한 이벤트 window.onpopstate 를 추가 한 것 입 니 다.사용자 가 그 두 단 추 를 누 르 면 이 사건 을 촉발 합 니 다.그러나 이 사건 만 으로 는 부족 하고 인 자 를 전달 할 수 있어 야 합 니 다.즉,이전 페이지 로 돌아 갈 때 그 페이지 의 pageIndex 를 알 아야 합 니 다.history 의 pushstate 방법 을 통 해 이 목적 을 달성 할 수 있 습 니 다.pushstate(pageIndex)는 현재 페이지 의 pageIndex 를 저장 하고 이 페이지 로 돌아 갈 때 이 pageIndex 를 얻 을 수 있 습 니 다.pushstate 의 매개 변 수 는 다음 과 같 습 니 다.
window.history.pushState(state, title, url);
그 중에서 state 는 object{}로 현재 페이지 의 데 이 터 를 저장 합 니 다.title 제목 은 큰 역할 을 하지 않 습 니 다.url 은 현재 페이지 의 url 입 니 다.이 url 이 바 뀌 면 브 라 우 저 주소 표시 줄 의 주소 도 달라 집 니 다.따라서 다음 페이지 의 데 이 터 를 요청 하 는 nextPage 함수 에 한 단계 더 많은 작업 을 추가 합 니 다.
function nextPage(){
pageIndex++;
makeRequest(pageIndex);
//
window.history.pushState({page: pageIndex}, null, window.location.href);
}
그리고 popstate 사건 을 감청 합 니 다.
//
window.addEventListener("popstate", function(event){
var page = 0;
// pushState, ,
if(event.state !== null){
page = event.state.page;
}
makeRequest(page);
pageIndex = page;
});
state 데 이 터 는 이벤트 로 들 어 옵 니 다.그러면 pageIndex 를 얻 을 수 있 습 니 다.그러나 이렇게 실현 하 는 데 문제 가 있 습 니 다.두 번 째 페이지 에서 페이지 를 새로 고 칠 때 오류 가 발생 할 수 있 습 니 다.다음 과 같 습 니 다.먼저 다음 페이지 를 두 번 째 페이지 로 누 른 다음 에 페이지 를 새로 고 칩 니 다.첫 번 째 페이지 가 나 오고 다음 페이지 를 누 르 면 두 번 째 페이지 가 나 옵 니 다.다시 누 르 면 문제 가 발생 합 니 다.
오른쪽 도구 모음 에서 처음 되 돌 아 왔 을 때 가 져 온 pageIndex 는 여전히 1 임 을 알 수 있 습 니 다.이러한 상황 에 대해 history 모델 을 분석 해 야 한다.다음 과 같다.
history 에 대한 작업 으로 이해 할 수 있 습 니 다.브 라 우 저 는 방문 기록 을 저장 하 는 대기 열 이 있 습 니 다.방문 하 는 모든 사이트 와 state 데 이 터 를 포함 합 니 다.처음에 대기 열의 첫 번 째 지침 은 page=0 의 위 치 를 가리 키 고 다음 페이지 를 누 를 때 push State 를 실 행 했 습 니 다.이 대기 열 에 요 소 를 삽입 하 는 동시에 push State 작업 을 통 해 이 요소 의 url 과 state 데 이 터 를 기록 하 였 습 니 다.여기 서 알 수 있 듯 이 push State 의 작업 에서 가장 중요 한 역할 은 역시 history 대기 열 에 요 소 를 삽입 하 는 것 입 니 다.그러면 브 라 우 저의 후퇴 단 추 는 회색 상태 가 아니 라 위 에서 말 한 데 이 터 를 저장 하 는 것 입 니 다.점 이 후퇴 할 때 팀 의 첫 번 째 지침 은 페이지=0 의 위 치 를 가리 키 고 점 이 전진 할 때 페이지=1 의 위 치 를 가리킨다.
페이지=1 의 위치 에서 페이지 를 새로 고침 하면 모델 은 다음 과 같 습 니 다.
두 번 째 단계 가 새로 고침 되 었 을 때 페이지 의 pageIndex 는 기본 값 0 으로 복원 되 었 기 때문에 page=0 은 첫 페이지 의 데 이 터 를 표시 하지만 history 에 사용 되 는 대기 열 은 변 하지 않 았 습 니 다.그리고 다음 페이지 를 눌 렀 을 때 이 대기 열 에 push 요 소 를 주 었 습 니 다.이 대기 열 에는 두 개의 pageIndex 가 1 인 요소 가 있 기 때문에 두 번 을 되 돌려 야 page=0 의 위치 로 돌아 갈 수 있 습 니 다.즉,위 에서 말 한 어 지 러 운 상황 입 니 다.
위의 분석 에 따 르 면 이러한 실현 은 문제 가 있 습 니 다.그러나 사용자 가 page=0 의 위치 에서 페이지 를 새로 고침 하지 않 으 면 여러 번 의 반환 단 추 를 눌 러 야 원래 의 페이지 로 돌아 갈 수 있 습 니 다.
따라서 새로 고침 할 때 현재 페이지 의 state 데 이 터 를 업데이트 해 야 합 니 다.replace State 로 줄 의 첫 번 째 포인터 데 이 터 를 교체 해 야 합 니 다.즉,현재 페이지 의 데이터 입 니 다.방법 은 페이지 초기 화 시 replace 입 니 다:
window.history.replace State({page:pageIndex/*여 기 는 0*/},null,window.location.href);
이렇게 모형 은:
그러나 사용자 가 새로 고침 할 때 가장 원 하 는 것 은 첫 페이지 로 돌아 가 는 것 이 아니 라 현재 페이지 를 표시 하 는 것 입 니 다.하나의 해결 방법 은 현재 페이지 의 window.history.state 데 이 터 를 사용 하 는 것 입 니 다.이 속성 브 라 우 저 는 비교적 늦게 지원 합 니 다.페이지 초기 화 시 pageIndex 를 설정 할 때 history.state 에서 가 져 옵 니 다:
var pageIndex = window.history.state === null ? 0 : window.history.state.page;
safari 에 있 는 history.state 는 최근 push State 에서 들 어 온 데 이 터 를 실행 하기 때문에 이 방법 은 chrome/fireforx 에서 통 하지만 safari 는 통 하지 않 습 니 다.두 번 째 방법 은 h5 의 localStorage 를 통 해 현재 페이지 수 를 저장 하 는 것 입 니 다.
// , localStorage
var pageIndex = window.localStorage.pageIndex || 0;
function nextPage(){
// index 1, localStorage
window.localStorage.pageIndex = ++pageIndex;
//
makeRequest(pageIndex);
window.history.pushState({page: pageIndex}, null, window.location.href);
}
window.addEventListener("popstate", function(event){
var page = 0;
if(event.state !== null){
page = event.state.page;
}
makeRequest(page);
// , page localStorage
window.localStorage.pageIndex = page;
});
페이지 의 모든 pageIndex 를 바 꾸 는 곳 을 localStorage 에 두 십시오.이렇게 페이지 를 새로 고 칠 때 현재 페이지 의 pageIndex 를 찾 을 수 있 습 니 다.위의 방법 은 모두 pageIndex 를 state 매개 변수 에 넣 었 고 세 번 째 매개 변수 url 에 넣 는 방법 도 있 습 니 다.즉,현재 페이지 의 주 소 를 바 꾸 는 방법 입 니 다.pageIndex 사이트 에서 가 져 오기:
//
var pageIndex = window.location.search.replace("?page=", "") || ;
function nextPage(){
// index
++pageIndex;
//
makeRequest(pageIndex);
window.history.pushState(null, null, "?page=" + pageIndex);
}
8 번 째 줄 의 push State 를 실행 하면 현재 사이트 주소 가 달라 집 니 다.한 가지 주의해 야 할 것 은 window.history.length 는 현재 대기 열의 요소 개 수 를 되 돌려 주지 만 history 자체 가 그 대기 열 이라는 것 은 아 닙 니 다.서로 다른 브 라 우 저 를 통 해 history[i]에 대한 출력:
history 는 하나의 배열 로 사용자 에 게 history.length 를 가 져 다 주 는 역할 을 하지만 채 워 진 내용 은 확실 하지 않 습 니 다.
history 를 사용 하 는 것 외 에 hash 를 이용 하 는 방법 도 있 습 니 다.왕 이 뉴스 는 바로 이런 방법 을 사 용 했 습 니 다.
//
var pageIndex = window.location.hash.replace("#page=", "") || ;
function nextPage(){
makeRequest(pageIndex);
window.location.hash = "#page=" + pageIndex;
}
window.addEventListener("hashchange", function(){
var page = window.location.hash.replace("#page=", "") || ;
makeRequest(page);
});
지원 성에 대해 서 는 caniuse 사이트:history IE 10 및 이상 지원,hashchange 의 지원 이 좋 고 IE8 및 이상 이 지원 합 니 다.hashchange 의 지원 성 은 좋 지만 history 의 장점 은 데 이 터 를 전달 할 수 있다 는 것 입 니 다.일부 복잡 한 응용 에 큰 역할 을 할 수 있 고 history 는 back/go 작업 을 지원 합 니 다.
이상 본 고 는 h5 의 history 개선 ajax 목록 에 대해 체험 을 요청 합 니 다.여러분 이 좋아 하 시 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
h5 이동단 핸드폰 장절 이벤트텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.