브라우저 뒤로 버튼을 사용할 때 페이지를 강제로 다시로드하는 방법은 무엇입니까?


84

어떻게 든 사용자가 브라우저 뒤로 버튼을 눌렀 음을 감지하고 jquery를 사용하여 새로 고침 (콘텐츠 및 CSS 다시로드)으로 페이지를 다시로드해야합니다.

jquery를 통해 이러한 작업을 감지하는 방법은 무엇입니까?

지금 브라우저에서 뒤로 버튼을 사용하면 일부 요소가 다시로드되지 않기 때문입니다. 그러나 웹 사이트의 링크를 사용하면 모든 것이 새로 고쳐지고 올바르게 표시됩니다.

중대한!

어떤 사람들은 내가 원하는 것을 오해했을 것입니다. 현재 페이지를 새로 고침하고 싶지 않습니다. 뒤로 버튼을 누른 후로드 된 페이지를 새로 고침하고 싶습니다. 여기에 더 자세한 방식으로 의미하는 바가 있습니다.

  1. 사용자가 page1을 방문하고 있습니다.
  2. page1에서-그는 page2에 대한 링크를 클릭합니다.
  3. 그는 page2로 리디렉션됩니다.
  4. 이제 (중요한 부분!) 1 페이지로 돌아가고 싶어 브라우저에서 뒤로 버튼을 클릭합니다.
  5. 그는 page1로 돌아 왔습니다. 이제 page1이 다시로드되고 "You are back!"과 같은 경고가 표시됩니다.

정상적인 사용자 행동을 해킹하는 대신 페이지로드시 코드가 작동하지 않고 페이지를 새로 고침해야하는 이유를 이해하려고 노력하지 않으시겠습니까?
Lelio Faieta 2017 년

2
@LelioFaieta 변경 사항을 표시하기 위해 수업을 변경합니다. 사용자가 무언가를 클릭하면 ajax를 통해 데이터베이스에서 값이 변경됩니다. ajax가 완료되면 css 클래스 cahnge 예를 들어 from onto off. 그리고 괜찮습니다. db에 저장되고 사용자는 모든 것을 올바르게 볼 수 있습니다. 이제 그는 다른 링크를 클릭합니다. 예를 들어 우리에 대한 페이지, 맞습니까? 이제 그는 회사 소개 페이지에 있습니다. Be는 이전 페이지로 돌아 가기로 결정하고 브라우저에서 뒤로 버튼을 클릭합니다. 그가 돌아 때 브라우저 그가 (클래스 OFF / ON) 아약스를 triggerd 전에 페이지 (아마 브라우저 cahing) 가리 켰을 때, 그는 페이지의 변경 사항을보고
존 Doeherskij

1
Ajax 호출에 get 또는 post를 사용하고 있습니까?
Lelio Faieta 2017 년

1
@LelioFaieta part2 .. 데이터 속성도 사용하고 효과가 없습니다. 페이지가 다시로드되면 모든 것이 좋을 것입니다. 해당 페이지에서 F5를 누르면 ajax를 통해 변경 한 값이 표시됩니다. 나는 이것이 css / html 부분이 완전히 다시로드되지 않을 때 브라우저 체킹 관련 문제라고 생각합니다. 그것은 단지 F5 키를 누른 후 다시로드
존 Doeherskij

@LelioFaieta $.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })아약스에 의한 것일 수 있다고 생각하십니까? 이것이 사실이라면 좋을 것입니다.
John Doeherskij

답변:


86

pageshow이벤트를 사용하여 브라우저가 히스토리 탐색을 통해 페이지로 이동할 때 상황을 처리 할 수 있습니다 .

window.addEventListener( "pageshow", function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != "undefined" && 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});

HTTP 캐시도 관련 될 수 있습니다. 캐시해야하는 리소스 만 캐시하려면 서버에서 적절한 캐시 관련 HTTP 헤더를 설정해야합니다. HTTP 캐시를 무시하기 위해 브라우저를 강제로 다시로드 할 수도 있습니다 window.location.reload( true ).. 그러나 나는 그것이 최선의 해결책이라고 생각하지 않습니다.

자세한 내용은 다음을 확인하십시오.


사용자 Dhiraj가 올바른 길을 가고 있지만 두 번 새로 고침하는 것을 도울 수 있습니까? 그런데, 나는 시도 window.addEventListener( "unload", function() {} );, 아무런 변화 이전과 뒤로 버튼 작동을하지만 아무것도하지 않는 것 (
존 Doeherskij

BFCache를 언로드하는 방법? 더 구체적인 정보로 코드를 업데이트 할 수 있습니까? 이 라인 window.addEventListener( "unload", function() {} );은 작동하지 않습니다. 완료 되었습니까?
John Doeherskij

Chrome 기록 탐색은 다소 혼란 스럽습니다. pageshow해결책을 시도하십시오 .
Leonid Vasilev

1
여전히 이중로드가 표시됩니다. 그래서 초를 위해 (내가 코드 내부가$(document).ready( function() { /* code here */ });
존 Doeherskij

3
window.performance.navigation더 이상 사용되지 않습니다. 내가 사용한 탐색 유형을 확인하려면window.performance.getEntriesByType("navigation")[0].type === "back_forward"
zero01alpha

49

이것이 게시 된 지 오래되었지만 이전 브라우저를 지원할 필요가 없다면 더 우아한 솔루션을 찾았습니다.

당신은 확인을 할 수 있습니다

performance.navigation.type

브라우저 지원을 포함한 문서는 여기에 있습니다 : https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

따라서 페이지가 뒤로를 사용하여 기록에서로드되었는지 확인하려면

if(performance.navigation.type == 2){
   location.reload(true);
}

2페이지가 역사로 이동하여 액세스 한 나타냅니다. 다른 가능성은 다음과 같습니다.

0:링크, 책갈피, 양식 제출 또는 스크립트를 따르거나 주소 표시 줄에 URL을 입력하여 페이지에 액세스했습니다.

1:페이지는 다시로드 버튼을 클릭하거나 Location.reload () 메서드를 통해 액세스했습니다.

255: 다른 방법

https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation에서 자세히 설명합니다.


참고 Performance.navigation.type 은 이제 'navigate'/ 'reload'/ 'back_forward'/ 'prerender'를 반환 하는 PerformanceNavigationTiming.type 대신 사용되지 않습니다 . https://developer.mozilla.org/en-US/docs/Web / API / PerformanceNavigationTiming / 유형


2
이 수표는 나를 위해 일했습니다. 2는 정확히 무엇을 의미합니까?
RitchieD

이것은 매력처럼 작동했습니다. .. 나는 그것을 대부분의 영역에 배치했습니다. .. 페이지는 다른 스크립트를로드하지 않고 다시로드되었습니다.
NMathur

이것은 매력처럼 작동했습니다. Great find ... 이것에 비해 느린 다른 답변과 달리 매우 빠르고 신뢰할 수 있습니다. TY
weBBer

이 사람은 크롬 브라우저와 협력 및 파이어 폭스하지 않았다
VR praaveen

7
이것은 더 이상 사용되지 않습니다 ( w3c.github.io/navigation-timing/#obsolete 참조 ).
David Vielhuber

22

jquery를 사용하십시오.

jQuery( document ).ready(function( $ ) {

   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
      location.reload(true);
   });

});

위의 내용은 ajax를 사용하여 뒤로 또는 앞으로 버튼을 클릭했을 때 100 % 작동합니다.

그렇지 않은 경우 스크립트의 다른 부분에 잘못된 구성이 있어야합니다.

예를 들어 이전 게시물의 예제 중 하나가 사용되면 다시로드되지 않을 수 있습니다. window.history.pushState('', null, './');

그래서 history.pushState(); 사용할 때 제대로 사용하십시오.

대부분의 경우 제안 사항은 다음과 같습니다.

history.pushState(url, '', url); 

window.history가 없으며 URL 이 정의되어 있는지 확인하십시오 .

도움이 되길 ..


이것은 IE에서 작동하지 않습니다. developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
RitchieD

@RitchieD-오늘부터 이것은 Windows 10의 IE11에서 잘 작동합니다. 참고 : EDGE를 사용하지 않습니다.
Dan G

그냥 팬이 답 "단지 jQuery를 사용"없습니다, 죄송합니다
스티븐

HTTP 캐시를 사용하려면 다시로드에서 "true"를 제거합니다. 대부분의 경우 자산을 다시로드 할 필요가 없습니다.
konyak

14

때문에 performance.navigation지금은 사용되지 않습니다, 당신이 시도 할 수 있습니다 :

var perfEntries = performance.getEntriesByType("navigation");

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}

이것은 최신 답변입니다
Java_Man

이 코드는 위의 Leonid의 답변 코드와 결합되어야합니다.
gornvix

이것은 나를 위해 잘 작동합니다. 최신 Chrome, Firefox, IE 및 Edge에서 테스트했습니다. Mac의 Safari에서 확인하지 않았습니다.
Tasawar Hussain

6

숨겨진 입력을 "no"값과 함께 새로 고침 표시기로 사용해야합니다.

<input type="hidden" id="refresh" value="no">

이제 jQuery를 사용하여 값을 확인할 수 있습니다.

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

뒤로 버튼을 클릭하면 숨겨진 필드의 값이 원래 페이지를 떠났을 때와 동일한 값을 유지합니다.

따라서 페이지를 처음로드 할 때 입력 값은 "no"가됩니다. 페이지로 돌아 오면 "예"가되고 JavaScript 코드가 새로 고침을 트리거합니다.


1
작동하지 않습니다. Firefox와 Chrome을 사용해 보았지만 작동하지 않습니다.
John Doeherskij

업데이트 된 질문을 확인하십시오. 아마도 당신과 다른 사람들이 나를 오해했을 것입니다. 이제 내가 성취하고 싶은 것이 훨씬 더 명확 해졌습니다. 감사합니다.
John Doeherskij

예, 오해했습니다. 질문을 자세히 업데이트 해 주셔서 감사합니다.
Dhiraj

이제 작동합니다. 그러나 그것은 2 번 재 장전되고 약간 이상해 보입니다. 처음으로 다시로드됩니다. 아무것도-이것은 아마도 기본 브라우저 동작입니다. 두 번째로 다시로드하면 (스크립트를 통해) 값이 원래대로 새로 고쳐 지지만 두 번 다시로드되기 때문에 좋지 않은 것 같습니다. 조금 개선하는 방법에 대한 아이디어가 있으시면 다시로드가 더 좋아 보이거나 한 번만 다시로드됩니까? Firefox보다 Chrome에서 더 좋아 보이지만 새로 고침이 더 빠르지 만 여전히 원래의 뒤로 상태 (1 초 또는 0.5 초 동안)가 표시되며 스크립트 다시로드는 그 이후에만 이루어집니다.
John Doeherskij

"이중로드"를 수정하는 방법에 대한 새로운 아이디어가 있습니까?
John Doeherskij

6

나에게 문제를 해결 한 대안은 페이지의 캐시를 비활성화하는 것입니다. 그러면 브라우저가 캐시 된 버전을 사용하는 대신 서버에서 페이지를 가져옵니다.

Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

최고의 솔루션이지만 여기에 내가 사용한 버전이 있습니다. Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetMaxAge(TimeSpan.Zero); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); Response.Cache.SetNoStore();
열성

2

현재 이것은 사용자가 뒤로 버튼을 클릭하는 경우 페이지를 새로 고침하는 가장 최신 방식입니다.

const [entry] = performance.getEntriesByType("navigation");

// Show it in a nice table in the developer console
console.table(entry.toJSON());

if (entry["type"] === "back_forward")
    location.reload();

소스는 여기 를 참조 하십시오


1

재 장전은 쉽습니다. 다음을 사용해야합니다.

location.reload(true);

그리고 다시 감지는 다음과 같습니다.

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});

작동하지 않음 (내가 시도 alert('test');대신에 location.reload(true);.. 파이어 폭스와 크롬 아무것도하지만 여전히 아무것도 내가 시도하지 않은 나는 준비 문서, 외부, 아무것도하지만, 작품 내에서 시도 나는 간단한 경고 () 또는 작동 THT 어떤 jQuery 코드를하려고하면 I.. 내 페이지에 jQuery 코드를 많이 가지고 있고 그것을 작동합니다.
존 Doeherskij

나는 대답을 편집했으며 새로운 해결책을 시도하십시오. 문제는 이전에 상태를 푸시해야합니다. 그렇지 않으면 popstate 이벤트가 발생하지 않습니다.
Anton Stepanenkov 2017 년

내가 원하는 것을 오해했을 것입니다. 더 자세한 설명으로 질문을 업데이트했습니다. 시간이 있으면 다시 확인해주세요. 감사합니다.
John Doeherskij

0

html 헤더 파일에서 다음 메타 태그를 사용하십시오. 이것은 나를 위해 작동합니다.

<meta http-equiv="Pragma" content="no-cache">

이 때 다시, 영업 이익은 요청한 페이지를 다시로드하지 않습니다
Timberman

-1

나는 최고의 답을 찾았고 그것은 나를 위해 완벽하게 작동합니다.

링크에서이 간단한 스크립트를 사용하십시오.

<A HREF="javascript:history.go(0)">next page</A>

또는 버튼 클릭 이벤트

<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">

이것을 사용하면 먼저 페이지를 새로 고친 다음 다음 페이지로 이동합니다. 다시 돌아 오면 마지막으로 새로 고친 상태가됩니다.

CAS 로그인에서 사용했으며 원하는 것을 제공합니다. 도움이 되었기를 바랍니다 .......

여기 에서 찾은 세부 정보


이것은 나를 위해 작동하지 않습니다. "0"은 무엇을 의미합니까?
Vincent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.