onpopstate에 추가하는 각 핸들러에 대해 특별한 조치를 취하고 싶지 않은 경우 내 솔루션이 흥미로울 수 있습니다. 이 솔루션의 큰 장점은 페이지 로딩이 완료되기 전에 onpopstate 이벤트를 처리 할 수 있다는 것입니다.
onpopstate 핸들러를 추가하기 전에이 코드를 한 번만 실행하면 모든 것이 예상대로 작동합니다 (일명 Mozilla ^^) .
(function() {
// There's nothing to do for older browsers ;)
if (!window.addEventListener)
return;
var blockPopstateEvent = document.readyState!="complete";
window.addEventListener("load", function() {
// The timeout ensures that popstate-events will be unblocked right
// after the load event occured, but not in the same event-loop cycle.
setTimeout(function(){ blockPopstateEvent = false; }, 0);
}, false);
window.addEventListener("popstate", function(evt) {
if (blockPopstateEvent && document.readyState=="complete") {
evt.preventDefault();
evt.stopImmediatePropagation();
}
}, false);
})();
작동 원리 :
Chrome , Safari 및 기타 웹킷 브라우저는 문서가로드 될 때 onpopstate 이벤트를 발생시킵니다. 이것은 의도 된 것이 아니므로 문서가로드 된 후 첫 번째 이벤트 루프 시클이 발생할 때까지 popstate 이벤트를 차단합니다. 이는 preventDefault 및 stopImmediatePropagation 호출에 의해 수행됩니다 (stopPropagation stopImmediatePropagation이 모든 이벤트 핸들러 호출을 즉시 중지하는 것과 달리).
그러나 Chrome이 onpopstate를 잘못 실행하면 문서의 readyState가 이미 '완료'상태이므로 문서가로드되기 전에 onpopstate 호출을 허용하기 위해 문서로드가 완료되기 전에 실행 된 opopstate 이벤트를 허용합니다.
업데이트 2014-04-23 : 페이지가로드 된 후 스크립트가 실행되면 popstate 이벤트가 차단되는 버그가 수정되었습니다.