JavaScript - bfcache/pageshow event - event.persisted always set to false?

后端 未结 3 1361
灰色年华
灰色年华 2021-02-02 01:59

In a standard Java / SpringMVC / JSP / jQuery web-app, I\'m trying to detect a \"Back\" (or history.go(-1)) event, in order to refresh (AJAX) a summary component/panel content w

相关标签:
3条回答
  • 2021-02-02 02:05

    I know this is a bit late but this works for me:

    window.onpageshow = function(e) {
    
        if (e.persisted) {
    
            alert("Page shown");
            window.location.reload();
        }
    };
    

    I don't think you need it in the document ready function, just use vanilla as above.

    0 讨论(0)
  • 2021-02-02 02:19

    This appears to be a bug in Chrome (also present in IE11).

    I have found the following workaround:

    <input type="hidden" id="cacheTest"></input>
    <script>
      var input = document.querySelector('#cacheTest')
    
      if (input.value === "") {
        // the page has been loaded from the server,
        // equivalent of persisted == false
      }
      else {
        // the page has been loaded from the cache,
        // equivalent of persisted == true
      }
    
      // change the input value so that we can detect
      // if the page is reloaded from cache later
      input.value = "some value"
    </script>
    

    This exploits the fact that in most browsers, when the page is loaded from the cache, form fields values are also conserved.

    0 讨论(0)
  • 2021-02-02 02:29

    I have found hidden input buttons are not a reliable solution since they may hold the wrong value when the user navigates back to the page and then hits refresh. Some browsers (Firefox) retain input values on refresh so every time the user hits refresh it will refresh again since the input button holds the wrong value. This is a typical scenario for forums (user views a topic, hits the back button to go back to the list of topics, and may continue to hit refresh to check if there are new topics).

    As noted by Grégoire Clermont, event.persisted is buggy in chrome (and IE) and this still hasn't been fixed for either browser as of Feb 2017. The good news is you can rely on window.performance.navigation.type == 2 for chrome and IE. Ironically Firefox is unreliable for the latter but it shouldn't matter since it is reliable for event.persisted. The following code worked for me:

    if (document.addEventListener) {
        window.addEventListener('pageshow', function (event) {
            if (event.persisted || window.performance && 
                window.performance.navigation.type == 2) 
            {
                location.reload();
            }
        },
       false);
    }
    
    0 讨论(0)
提交回复
热议问题