什么是在浏览器上使window.history.state为null的可能情况?

时间:2016-03-10 18:48:44

标签: javascript jquery browser-history pushstate html5-history

我的网站的查询字符串网址如下:

?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1

当用户转到下一页(从第1页到第2页)时:

  1. 我们明确地增加pn(页码加1)并将其设置在查询字符串URL中。

    更改了查询字符串:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=2
    

    我还存储旧的查询字符串,它看起来像:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
    
  2. 然后我将两者都推送到窗口历史记录以更改URL并保存以前的浏览器:

    window.history.pushState(oldQS, null, newQS);
    
  3. 执行此操作后,当我在第2页时,我会检查window.history.state。它存储了我以前的状态:

    ?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
    
  4. 我从第2页按回浏览器返回第1页。我把断点放在:

    $(window).on('popstate', function(e) {
        console.log(e.originalEvent.state)
    });
    

    e.originalEvent.statenull

  5. 观察:

    • window.history.state不是null,并且当我在第2页时存储正确的值。
    • 当我点击浏览器时,它会获得null值。

    到目前为止我做了什么:

    (尚未奏效。)

    • hashchange事件中设置断点,但没有帮助,因为网址中没有#。

    • 在我的Javascript代码上的每个window.history函数上添加断点,例如pushState()replaceState(),但当我按下浏览器时,它们都没有被点击。

      < / LI>

    我不知道所有其他地方/功能可能会将window.history.state更改为null

    如何通过单击浏览器来确定它变为null的方式和位置?

1 个答案:

答案 0 :(得分:0)

你问:

  

我不知道所有其他地方/函数可以将window.history.state更改为null。

     

如何通过单击浏览器来确定它变为null的方式和位置?

让我们阅读W3C HTML5规范:

  

5.5.2 The History interface

     

...

     

History接口的state属性必须返回用户代理设置的最后一个值。最初,它的值必须为null。

结论:加载文档时,history.state最初为null

  

5.6.10 History traversal

     

当需要用户代理将历史记录遍历到指定条目[...]时,用户代理必须按以下方式执行操作。

     

...

     
      
  1. 如果条目是状态对象条目,则让state成为该状态对象的结构化克隆。否则,让state为null。
  2.         

    ...

         
        
    1. 如果指定条目的Document具有最新条目,并且该条目不是指定条目,则将状态更改为true;否则就是假的。
    2.         

      ...

           
          
        1.   
        2. 如果状态更改为true,则使用PopStateEvent接口在Document的Window对象上触发名为popstate的受信任事件,并将state属性初始化为state的值。 [...]
        3.   
      1.   

结论:当导航回文档加载时的状态时,popstate事件触发的状态为null