새로 고치지 않고 ajax 및 html5 변경 페이지 URL

伊谢尔伦
풀어 주다: 2016-11-22 13:59:11
원래의
1527명이 탐색했습니다.

성능

크롬이나 파이어폭스 및 기타 브라우저를 사용하여 이 블로그, github.com, plus.google.com 및 기타 웹사이트를 방문하시면 주의하시면 페이지 간 클릭이 발생하는 것을 확인하실 수 있습니다. ajax 요청을 통해 비동기화되고 동시에 페이지의 URL이 변경되었습니다. 그리고 브라우저의 앞뒤를 매우 잘 지원할 수 있습니다.

무엇이 이렇게 강력한 기능을 가지고 있는 걸까요?

HTML5는 새로 고치지 않고 페이지 URL을 변경하는 데 사용되는 새로운 API인 History.pushState 및 History.replaceState를 참조합니다.

기존 AJAX와의 차이점

기존 Ajax에는 다음과 같은 문제점이 있습니다.

1. 페이지 내용은 새로 고침 없이 변경할 수 있으나, 페이지 URL은 변경할 수 없습니다

2. 접근성을 높이기 위해 콘텐츠 변경 후 URL의 해시가 변경되는 경우가 많습니다

3. 해시 방식은 브라우저의 정방향 및 역방향 문제를 잘 처리하지 못합니다

4. 게다가 브라우저는 onhashchange 인터페이스를 도입했습니다. 이를 지원하지 않는 브라우저는 해시가 변경되었는지 여부만 주기적으로 확인할 수 있습니다

5. 그러나 이 방법은 검색 엔진에 매우 비우호적입니다

6. Twitter와 Google은 #!xxx(즉, 해시의 첫 번째 문자는!)를 사용하기로 합의했으며 검색 엔진에서는 이를 지원합니다.

기존 Ajax로 인해 발생하는 문제를 해결하기 위해 HTML5에 새로운 API가 도입되었습니다. 즉,history.pushState,history.replaceState

pushState를 통해 브라우저 기록을 조작할 수 있으며 replacementState 인터페이스 및 현재 페이지의 URL을 변경합니다.

pushState는 지정된 URL을 브라우저 기록에 추가하는 것이고, replacementState는 현재 URL을 지정된 URL로 바꾸는 것입니다.

사용 방법

var state = {
    title: title,
    url: options.url,
    otherkey: othervalue
};
window.history.pushState(state, document.title, url);
로그인 후 복사

제목과 URL 외에도 상태 객체에 다른 데이터를 추가할 수도 있습니다. 예를 들어 Ajax 전송을 위한 일부 구성을 저장하려고 합니다. .

replaceState와 pushState는 유사하므로 여기서는 소개하지 않겠습니다.

브라우저의 앞으로 및 뒤로 작업에 응답하는 방법

onpopstate 이벤트는 window 개체에서 제공됩니다. 위에서 전달된 상태 개체는 이벤트의 하위 개체가 되므로 저장된 제목과 URL을 얻을 수 있습니다.

window.addEventListener('popstate', function(e){
    if (history.state){
        var state = e.state;
        //do something(state.url, state.title);
    }
}, false);
로그인 후 복사

이러한 방식으로 Ajax와 pushState를 결합하여 새로 고침 없이 완벽하게 탐색할 수 있습니다.

일부 제한 사항

1. 전달된 URL은 동일한 도메인에 있어야 하며 도메인을 교차할 수 없습니다

2. 상태 개체는 많은 사용자 정의 속성을 저장할 수 있지만 개체입니다. DOM 객체와 같이 직렬화할 수 없는 객체는 저장할 수 없습니다.

백엔드에서 일부 처리에 해당

이 모드에서는 ajax를 사용하여 새로 고침 없이 탐색하는 것 외에도 변경된 URL을 직접 요청한 후 정상적으로 탐색할 수 있는지 확인하는 것도 필요합니다. 따라서 백엔드는 이러한 처리를 받아야 합니다.

1. pushState를 사용하여 ajax에 setRequestHeader('PJAX', 'true')와 같은 특수 헤더를 보냅니다.

2. 백엔드가 PJAX=true인 헤더를 얻으면 페이지의 공통 부분이 출력되지 않습니다. 예를 들어, PHP는 다음

function is_pjax(){
    return array_key_exists('HTTP_X_PJAX', $_SERVER) && $_SERVER['HTTP_X_PJAX'] === 'true';
}
로그인 후 복사

을 통해 판단할 수 있습니다. 인터페이스에는 pushState, replacementState, onpopstate만 있지만 사용 시 많은 처리가 필요합니다.

이를 위해 jquery 기반 플러그인이 작성되었으며, ajax+history.pushState가 pjax에 캡슐화되었습니다. 프로젝트 주소: https://github.com/welefen/pjax. qwrap, Kissy 3개 버전

또한 HTML4 및 HTML5의 효과를 고려하고 싶다면 History.js를 참조할 수 있으며 프로젝트 주소는 https://github.com/browserstate/history입니다. .js .

참고자료:

1. HTML5 History API 소개

2. 브라우저 기록 조작

3. 🎜>

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿