2011-03-14 2 views
23

최근 사파리 중 5가 릴리스되었으며 내 웹 사이트에 문제가있는 것으로 나타났습니다. 고전적인 ASP를 실행하는 역동적 인 웹 사이트가 있습니다. (그다지 중요하지 않지만) 사이트는 히스토리 스택을 창의적으로 사용합니다. 예를 들어 제품을 나열한 페이지에서 제품에 대한 세부 정보로 이동하여 제품 (관리보기)을 변경할 수 있습니다. 제품 저장을 클릭하면 정보가 AJAX를 통해 서버로 전송되고 history.back()이 발행됩니다. 이것은 모든 브라우저에서 훌륭하게 작동합니다 (사파리 < = 4 포함). 그러나 새로 출시 된 사파리 5에서는 작동이 중지되었습니다. 사파리 5에서 다시 클릭하면 실제로 페이지를 새로 고치지 않고 캐시에서로드하기 만하는 것으로 보입니다. 즉, 상세보기에서 변경 한 내용이 표시되지 않습니다. 사파리에서이 작품을 만들려면 어떻게해야합니까? 이것은 (모든 페이지의 상단 포함) 내가 캐싱을 해제해야 현재의 코드입니다 :Safari 5의 뒤로 버튼 캐시 방지

Dim pStr 
pStr = "private, no-cache, no-store, must-revalidate" 
Response.AddHeader "pragma","no-cache"  '? 
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "cache-control", "post-check=0, pre-check=0"  '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"  '? 
Response.AddHeader "Last-Modified", Now() 

답변

45

unload 처리기가 더 이상 작동하지 않습니다. 대신 onpageshow 이벤트의 persisted 속성을 확인할 수 있습니다. 초기 페이지로드시 false로 설정됩니다. 페이지가 bfcache에서로드되면 true로 설정됩니다.

Kludgish 솔루션은 bfcache에서 페이지를로드 할 때 강제로 다시로드하는 것입니다.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

당신이 jQuery를 사용하는 경우 다음을 수행하십시오

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload() 
    } 
}); 
+1

그레이트 픽스 - iOS 6 (iPhone 및 iPad)에서 작동 확인! 미카 감사합니다! – Jesse

+2

이것은 Safari 6, 바탕 화면에서도 작동합니다. 오래된 윈도우의 해킹은 더 이상 일관되게 작동하지 않습니다. 이것은 이제 '올바른'대답으로 간주됩니다. –

+1

이것은 iPad에서 작동합니다. 불행하게도 (적어도 저에게는) 슬립 모드에서 깨어날 때 페이지를 다시로드하는 부작용이 있습니다. 그리고 사용자가 모든 종류의 디스플레이 변경을 초래하는 양식 요소를 변경 한 경우 사용자는 다시 시작해야합니다. 뒤로 버튼에서만 페이지를 다시로드하는 방법이 있습니까? 깨어있는 경우에는 그렇지 않습니다. –

7

일부 googeling 후 나는 그것에 대해 너무 행복하지 않다하지만 나는 해결책을 발견했습니다 파고. body-tag에 onunload=""을 설정하면 Safari가 페이지를 무효화하고 uppon window.history.back();을 다시로드합니다.

+1

나는 사용자가 브라우저 뒷면에 재 검증 싶은 제외하고 내가 비슷한 문제가 발생했습니다 (학생들은 아이 패드에 교대로) . onunload = ""해킹은 노트북에서 Safari의 재확인을 강제로 잘하는 것처럼 보이지만 iPad의 모바일 Safari에서는 그렇지 않습니다. 이견있는 사람? – John

3

는 여기에 또 다른 방법 : 닷넷에서 body 태그에 HTML을 추가 (= ""으로 onUnload는) 내 경우에는 세 개의 파일을 수정 관여하기 때문에

function invalidateBackCache() { 
     // necessary for Safari: mobile & desktop 
    } 

    window.addEventListener("unload", invalidateBackCache, false); 

내가이 경로를 이동하기로 결정했습니다. jQuery에서 onunload 속성을 설정해도 문제가 해결되지 않았습니다.

이것은 모바일 Sarfari (iPad)에서도 작동합니다.

+2

아니,이 중 하나 (ipad에 다시 버튼) 나를 위해 작동하지 않았다. 그것은 새로 고침 작업 중입니다. – sirmak

+1

이것에 대한 아이디어는 나에게 정확하고 효과적입니다. '$ (window) .on ('unload', function() {}); ' – Sam

+0

모바일 사파리의 최신 버전에서 unload 이벤트가 문제가있는 것으로보고되었으므로 다음과 같은 jquery 종속 코드를 사용했습니다. 더블 체크 –