는 다음과 같은 고려 : - 파이어 폭스 내 IE 오리 펀치 모두에서이 그것을 수행 정확히 무엇인가 -
var originalPath = window.location.pathname.toString();
history.pushState({ value: 'Foo' }, '', 'state-1');
history.pushState({ value: 'Bar' }, '', 'state-2');
history.pushState({ value: 'Baz' }, '', 'state-3');
history.back();
history.back();
console.log(history.state.value);
//So we can hit refresh and see the results again...
setTimeout(function() {
history.replaceState(null, '', originalPath);
}, 250);
하나는 '푸'를 반환하는 코드의 덩어리를 기대를하지만, 크롬, 그것은 'Baz'로 응답합니다.
몇 가지 조사를 한 후에 문제를 해결했습니다. IE와 Firefox는 기록을 동 기적으로 업데이트 한 다음 페이지로드가 필요한 경우 비동기로 이동합니다. Chrome은 즉시 비동기로 표시됩니다.
증거 : 파이어 폭스에서
window.onpopstate = function() {
console.log('ping');
}
history.pushState({ value: 'Foo' }, '', 'state-1');
history.back();
console.log('pong');
이 반환 '핑'; 'pong'- 이벤트가 history.back() 호출의 일부로 전달되었음을 나타냅니다. Chrome에서는 'pong'을 반환합니다. 'ping'- 이벤트가 대기열에 배치되어 디스패치됨을 나타냅니다.
이 이벤트 디스패치 모델이 기록 및 위치 개체의 상태를 관리하는 데 사용되지 않았 으면 좋지만 분명히 그렇습니다.
window.onpopstate = function() {
console.log('Event...', history.state, window.location.pathname.toString());
}
history.pushState({ value: 'Foo' }, '', 'state-1');
history.back();
console.log('Inline...', history.state, window.location.pathname.toString());
이 흥미로운 특질이며, 내 단위 테스트를 제대로 해결할하기 위해 jQuery를 이연 체인의 사용을 필요로 하나. 나는 그것에 대해 특별히 행복하지 않지만 무엇을 할 수 있습니까?