Can I prevent history.popstate from triggering on initial page-load?

前端 未结 5 1911
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-30 22:43

I\'m working on a site that serves content via AJAX.

If you click an item in the menu, a content div gets updated with $.get response, nothing fancy.

相关标签:
5条回答
  • 2020-11-30 23:04

    You need to get the event.originalEvent

    // Somewhere in your previous code
    if (history && history.pushState) {
      history.pushState({module:"leave"}, document.title, this.href);
    }
    
    
    $(window).bind("popstate", function(evt) {
      var state = evt.originalEvent.state;
      if (state && state.module === "leave") {
        $.getScript(location.href);
      }
    });
    
    0 讨论(0)
  • 2020-11-30 23:18

    When the popstate event is fired on page load it will not have a state property in the event object. This allows you to check if the event is fired for a page load or not.

    window.onpopstate = function (event) {
      if (event.state) {
        // do your thing
      } else {
        // triggered by a page load
      }
    }
    
    0 讨论(0)
  • 2020-11-30 23:20

    Using the native HTML5 History API you're going to run into some problems, every HTML5 browser handles the API a little bit differently so you can't just code it once and expect it to work without implementing workarounds. History.js provides a cross-browser API for the HTML5 History API and a optional hashchange fallback for HTML4 browsers if you want to go down that route.

    For upgrading your website into a RIA/Ajax-Application you can use this code snippet: https://github.com/browserstate/ajaxify

    Which is part of the longer article Intelligent State Handling which goes into explanations about hashbang, hashes and the html5 history api.

    Let me know if you need any further help :) Cheers.

    0 讨论(0)
  • 2020-11-30 23:20

    I use the below approach to change the address bar and save the current state including the current HTML body, and I reload it on the back button click without any other AJAX call. All gets saved in your browser:

    <script type="text/javascript">
       $(document).ajaxComplete(function(ev, jqXHR, settings) {
          var stateObj = { url: settings.url, innerhtml: document.body.innerHTML };
          window.history.pushState(stateObj, settings.url, settings.url);
       });
    
       window.onpopstate = function (event) {
          var currentState = history.state;
          document.body.innerHTML = currentState.innerhtml;
       };
    </script>
    
    0 讨论(0)
  • 2020-11-30 23:24

    When the browser first loads, it always fires a popstate event. So you need to determine if this popstate is yours or not.

    When you do your pushState, make sure you have a state object. That way you can check it later.

    Then on the popstate handler, check the state object :)

    $(function() {
        $(window).bind("popstate", function(data) {
            if (data.state.isMine)
                $.getScript(location.href); 
        });
    });
    
    // then add the state object
    history.pushState({isMine:true},title,url);
    

    Let me know if you need any more help :)

    0 讨论(0)
提交回复
热议问题