Ajax, 뒤로 버튼 및 DOM 업데이트


113

자바 스크립트가 페이지 A에서 DOM을 수정하면 사용자는 페이지 B로 이동 한 다음 뒤로 버튼을 눌러 페이지 A로 돌아갑니다. 페이지 A의 DOM에 대한 모든 수정 사항이 손실되고 사용자에게 원래 서버에서 검색된 버전이 표시됩니다.

stackoverflow, reddit 및 기타 많은 인기 웹 사이트에서 이러한 방식으로 작동합니다. (이 질문에 테스트 댓글을 추가 한 다음 다른 페이지로 이동하고 뒤로 버튼을 눌러 돌아 오세요. 댓글이 "사라질"것입니다.)

이것은 의미가 있지만 일부 웹 사이트 (apple.com, basecamphq.com 등)는 어떻게 든 브라우저가 사용자에게 페이지의 최신 상태를 제공하도록 강제합니다. ( http://www.apple.com/ca/search/?q=ipod 로 이동 하여 상단의 다운로드 링크를 클릭 한 다음 뒤로 버튼을 클릭하면 모든 DOM 업데이트가 유지됩니다.)

불일치는 어디에서 왔습니까?


흥미롭게도 Apple은 해시를 수정하지 않고 상태를 기억하고 있습니다. hmmm
James

애플 외모 그들은 단지 응답 캐싱을 조작하는 것 같은
BigBlondeViking

다른 사람들이 이미 제안했듯이 이것은 javascript 또는 ajax와 관련된 것이 아닙니다. 정답을 얻으려면 이러한 태그를 제거해야합니다.
BYK

Apple의 예는 좋지 않습니다. 검색 영역 [ex : products]을 계약하고 링크를 클릭 한 다음 뒤로 누르면 DOM이 유지되지 않습니다. 많은 사람들이 제안한 해시 솔루션을 찾고 있습니다.
BigBlondeViking

뒤로 버튼을 눌렀을 때 Apple은 내가 어떤 검색 결과 페이지에 있었는지 전혀 기억하지 못합니다. IE7 사용. 해시 솔루션이 필요합니다. 참조 : Facebook.
Josh Stodola

답변:


106

한 가지 대답 : 무엇보다도 언로드 이벤트로 인해 뒤로 / 앞으로 캐시가 무효화 됩니다.

일부 브라우저는 전체 웹 페이지의 현재 상태를 소위 "bfcache"또는 "페이지 캐시"에 저장합니다. 이렇게하면 뒤로 및 앞으로 버튼을 통해 탐색 할 때 페이지를 매우 빠르게 다시 렌더링 할 수 있으며 DOM 및 모든 JavaScript 변수의 상태를 보존 할 수 있습니다. 그러나 페이지에 onunload 이벤트가 포함 된 경우 이러한 이벤트는 잠재적으로 페이지를 작동하지 않는 상태로 만들 수 있으므로 페이지는 bfcache에 저장되지 않고 다시로드되어야합니다 (그러나 표준 캐시에서로드 될 수 있음). 모든 onload 핸들러 실행을 포함하여 처음부터 렌더링됩니다. bfcache를 통해 페이지로 돌아갈 때 DOM은 onload 핸들러를 실행할 필요없이 (페이지가 이미로드 되었기 때문에) 이전 상태로 유지됩니다.

bfcache의 동작은 Cache-Control 및 기타 HTTP 헤더와 관련하여 표준 브라우저 캐시와 다릅니다. 대부분의 경우 브라우저는 표준 캐시에 저장하지 않더라도 bfcache에 페이지를 캐시합니다.

jQuery는 자동으로 언로드 이벤트를 창에 첨부하므로 안타깝게도 jQuery를 사용하면 DOM 보존 및 빠른 뒤로 / 앞으로 가기를 위해 페이지가 bfcache에 저장되지 않습니다.. [업데이트 : jQuery 1.4에서 수정되어 IE에만 ​​적용됨]


3
당신은 그것을 완전히 못 박았습니다. reddit과 stackoverflow는 모두 jquery를 사용하고 basecamp와 apple은 prototypejs를 사용합니다. 이것은 거의 모든 것을 설명합니다.
lubos hasko

+1 재미 (크로스하지 브라우저하지만) 문제는 ...이 시작했을 때보다 훨씬 다릅니다
BigBlondeViking

1
Internet Explorer에서도 재현 할 수 있기 때문에 아마도 크로스 브라우저 일 것입니다. 자바 스크립트가 활성화 된 모든 웹 브라우저는 어쨌든이 문제를 처리해야한다고 확신합니다. 그러나 이것은 정말 엉망입니다. 당신이 그것에 대해 생각할 때, 뒤로 버튼은 항상 사람들을 모든 DOM 업데이트, 자바 스크립트 상태 등에서 마지막으로 본 페이지로 이동시켜야합니다. 개발자는 언로드 이벤트에서 무언가를하여 이것을 깨서는 안됩니다. 만약 그렇다면, 웹 브라우저는 bfcache를 전혀 사용하지 않음으로써 문제를 해결하려고해서는 안됩니다. 전체 언로드 이벤트는 하나의 큰 농담입니다. 나는 그것이 메모리 누수를 패치하는 데 사용되는 99 %의 시간을 확신합니다.
lubos hasko

1
특히 IE 메모리 누수입니다. :) jQuery 언로드 이벤트는 Firefox 2에서 (완전히 관련이없는) 버그를 수정하기 위해 발생합니다.하지만 다른 브라우저에서는 필요하지 않습니다. dev.jquery.com/ticket/3015 아웃 바운드 클릭 추적 또는 webapp 상태 저장과 같은 onunload의 다른 용도에 대해 들어 본 적이 있다고 생각하지만 직접 사용할 이유가 없었으며 개발자가 사이트는 사용자에게 더 느리고 고통 스럽습니다 (reddit 댓글 페이지로 다시 이동하면 댓글 축소 상태가 재설정되는 방식이 싫습니다). 그것이 그들의 특권입니다.
Miles

1
unload 이벤트는 Firefox 및 Chrome이 아닌 IE에만 ​​첨부됩니다. 최신 버전의 사파리는 개발자가 아무것도 할 필요없이 dom 상태를 보존합니다.
David

15

Chrome이 Safari처럼 작동하도록 노력해 왔으며 작동하는 유일한 방법 Cache-control: no-store은 헤더 에 설정 하는 것입니다. 이렇게하면 사용자가 뒤로 버튼을 누를 때 브라우저가 서버에서 페이지를 다시 가져옵니다. 이상적이지는 않지만 오래된 페이지를 표시하는 것보다 낫습니다.


5
이것은 원래 질문에 대한 정답입니다. 뒤로 버튼에서 서버를 강제로 다시로드하려면 cache-control 'no-store, no-cache, must-revalidate'를 사용하십시오. Chrome은 저장하지 않기를 원하고 IE는 반드시 재확인을 원합니다. 다른 브라우저 (및 w3c)의 경우 캐시가 없으면 충분합니다.
woens

3

Facebook은 ajax 요청에 대한 URL의 해시 식별자를 수정하여 페이지 상태를 기억합니다. 이러한 변경 사항은 브라우저 기록에 기록되므로 사용자가 뒤로 버튼을 클릭하면 해시가 이전과 같이 변경됩니다. 따라서 has 식별자를 모니터링하고 브라우저에 의해 변경 될 때 반응하려면 Javascript가 필요하다는 것을 암시합니다. Andreas Blixt에는 사용 가능한 해시 모니터링 스크립트가 있습니다 .


오늘로는 페이스 북이 지금 무엇을 말해 줄 수 그렇게 diesn't
Ravinder하기 Payal

3

이것은 해시 (#) 기호와 관련이 없습니다.

애플의 HTTP 헤더를 확인한다면 단순히 페이지를 캐싱하는 것입니다.


애플 예 가난, 그들은 페이지 상태를 "저장"하지 않는, 그의 가정은 DOM은 잘못된 보존
BigBlondeViking

2

URL 해시 / 조각 식별자를 사용하는 것은 Ajax 및 DOM 업데이트에 의존하는 웹 애플리케이션에서 상태를 후크 / 기억하는 매우 일반적인 방법입니다.

Really Simple History 프로젝트에서 몇 가지 아이디어를 확인하십시오 . URL에서 해시 변경 사항을 모니터링 할 수 있으며 rsh는 브라우저 차이를 고려하여이를 수행합니다.


1

문제가있는 사람을 위해 Rails-당신의 문제는 bfcache가 아닙니다 (내 생각에)-그것은 turbolinks보석입니다. 제거하는 방법은 다음과 같습니다 .

바라건대 이것은 시간을 절약하고 벽에 머리를 부딪 힐 것입니다.


0

당신이 찾고있는 것은 URL 해시 관리 유형입니다. URL의 #은 클라이언트 측 전용입니다.

JS로 뒷면의 상태를 변경하면 URL #의 데이터를 업데이트합니다.

또한 해시가 변경되었는지 모니터링하고 해시의 새 데이터를 기반으로 페이지 상태를로드하는 몇 가지 유형의 폴링을 추가합니다.

이것 좀보세요 :

http://ajaxpatterns.org/Unique_URLs


3
이것은 해시 기호와 관련이 없습니다.
Luca Matteis

3
당신은 틀 렸습니다. 그는 AJAX 솔루션에서 페이지 상태를 보존하는 가장 일반적인 방법을 찾고 있습니다.
BigBlondeViking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.