[javascript] Firefox 기록으로 돌아 가면 JavaScript가 실행되지 않습니다.

Firefox에서 뒤로 버튼을 사용하여 이전에 방문한 페이지로 이동하면 해당 페이지의 스크립트가 다시 실행되지 않습니다 .

거기에 어떤 수정 / 해결 방법 페이지를 두 번째로 볼 때 스크립트를 다시 실행해야하는가?

Google 크롬과 Internet Explorer에서 동일한 페이지를 테스트했으며 의도 한대로 작동합니다.


문제를 테스트하는 데 사용한 파일과 단계는 다음과 같습니다.

(0.html로 이동, 클릭하여 1.html로 이동, 뒤로 버튼)

0.html

<html><body>
<script>
  window.onload = function() { alert('window.onload alert'); };
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

1.html

<html><body>
<p>Go BACK!</p>
</body></html>



답변

window.onunload에서 호출 할 빈 함수를 설정합니다.

window.onunload = function(){};

예 :

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){};
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

출처 :
http://www.firefoxanswer.com/firefox/672-firefoxanswer.html (보관 버전)


답변

Firefox에서 뒤로 버튼을 사용하여 이전에 방문한 페이지로 이동하면 해당 페이지의 스크립트가 다시 실행되지 않습니다.

정확하고 좋은 일입니다.

Firefox (및 Safari 및 Opera)에서 링크를 누르면 다음 페이지로 이동하기 위해 페이지가 즉시 파괴되지 않습니다. 페이지를 그대로 유지하고보기에서 숨길뿐입니다. 뒤로 버튼을 누르면 문서를 다시로드하지 않고도 이전 페이지를 다시 볼 수 있습니다. 이것은 훨씬 더 빠르므로 사용자에게 더 부드러운 뒤로 / 앞으로 페이지 전환이 가능합니다.

이 기능을 bfcache 라고합니다 .

사용자가 이전에로드하고 사용하는 동안 페이지에 추가 한 모든 콘텐츠는 그대로 유지됩니다. 페이지 요소에 연결 한 모든 이벤트 처리기는 계속 연결됩니다. 설정 한 시간 제한 / 간격은 계속 활성화됩니다. 따라서 당신이 숨겨졌다가 다시 나타났다는 사실을 알아야 할 이유가 거의 없습니다. onload스크립트 코드를 다시 호출 하거나 인라인하는 것은 잘못된 것 입니다. 해당 함수에서 수행 한 바인딩 및 콘텐츠 생성은 동일한 콘텐츠에 대해 두 번째로 실행되어 잠재적으로 비참한 결과가 발생하기 때문입니다. (예 : document.write인라인 스크립트에서는 페이지가 완전히 파괴됩니다.)

에 쓰기 window.onunload가 영향을 미치는 이유 는 bfcache를 구현하는 브라우저가-언제 폐기 될지 알 필요가있는 페이지와의 호환성을 위해-언제 onunload발생하는지 알기 위해 관심이 있다고 선언하는 페이지 는 bfcache가 비활성화됩니다. 해당 페이지는 bfcache에서 가져 오는 대신 페이지로 돌아갈 때 새로로드됩니다.

따라서 설정 window.onunload= function() {};하면 실제로 수행하는 작업은 의도적으로 bfcache를 깨는 것입니다. 이로 인해 페이지 탐색 속도가 느려지므로 최후의 수단으로 사용하지 마십시오.

bfcache를 엉망으로 만들지 않고 사용자가 언제 페이지를 떠나거나 다시 돌아 왔는지 알아야하는 경우 대신 onpageshowonpagehide이벤트를 트랩 할 수 있습니다 .

window.onload=window.onpageshow= function() {
    alert('Hello!');
};


답변

이벤트 의 persisted속성을 확인할 수 있습니다 pageshow. 초기 페이지로드시 false로 설정됩니다. 페이지가 캐시에서로드되면 true로 설정됩니다.

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From bfcache");
    }
};

어떤 이유로 jQuery에는 이벤트에이 속성이 없습니다. 그래도 원래 이벤트에서 찾을 수 있습니다.

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        alert("From bfcache");
    }
});


답변

아무것도하지 않는 “onunload”이벤트에 연결 :

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){};
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>


답변

내가 아는 한 Firefox는 onLoad다시 이벤트를 발생시키지 않습니다 .

대신 여기이 링크를 기반으로 onFocus를 트리거해야합니다 .


답변

사용자가 브라우저 기록을 사용하여 페이지로 다시 이동할 때 페이지가 JavaScript를 실행하도록하는 간단한 방법은 OnPopState 이벤트입니다. 이를 사용하여 홈페이지 ( https://fynydd.com ) 에서 비디오를 일시 중지하고 재생합니다 .

window.onpopstate = function() {

    // Do stuff here...
};


답변

ajax 작업과 같은 경우 URL 변경 리스너를 사용할 수 있습니다.

$(window).on('hashchange', function() {
        ....
});