更改文档时窗口事件会发生什么?

eri*_*hak 14 javascript jquery html5 dom browser-history

嘿,我statechange在窗口上设置了以下事件:

History.Adapter.bind(window,'statechange',function(e){ 
 console.log("statechange event occured ");
 //more code
    var newDoc = document.open();
    newDoc.write(file);
    newDoc.close();
});
Run Code Online (Sandbox Code Playgroud)

我正在使用history.js,但在这种情况下无关紧要,因为它会定期绑定statechange,我得到的值file应该是并且工作正常.

现在我在外部js文件中有这个代码(和其他代码),在我遍历所有a标签的文件中并应用以下click事件:

    $(element).on("click",function(e){
    e.preventDefault();
    //more code

    History.pushState({file : file},title, fullHref);


});
Run Code Online (Sandbox Code Playgroud)

现在当我点击文档时按预期更改但是当尝试使用后退/前进按钮时,statechange事件不会触发.

我应该提一下,这个js也包含在我加载的文件中.

所以我最初的想法是,当文档发生变化但窗口没有变化时,事件仍然存在.这是不正确的,因为它应用statechange事件多次时间.所以我尝试使用cookie一次应用该事件,但仍然做同样的事情.

现在,如果不是更改文档而是简单地将其应用于jQuerys .html(),则statechange 事件将被触发,因此我猜它与文档有关.

为什么会这样?我相信如果我更多地了解在更换文档时窗口事件会发生什么,我可以解决这个问题.

尝试:

  • 我现在也尝试popstate通过常规的历史API 绑定到事件,仍然提供相同的结果.pushState不会激活popstate,但后退按钮确实没有状态.
  • 我得出结论,我不应该使用history.js,因为我认为问题来自那里,所以我"解决"我的问题popstate仍然导致问题作为document.open似乎触发popstate.仍在寻找更多信息
  • 我尝试过使用on相同的结果

信息:

  • 这个例子我们使用History的事实是因为history.js,如果我使用常规历史API仍然存在同样的问题.

我在mdn中读过:

{{gecko_minversion_note("1.9.2","从Gecko 1.9.2开始,document.open()使用

它使用的URI的文档的主体,而不是从堆栈中取出主体.因此,即使使用wrappedJSObject,也无法再将chrome.write()调用到chrome中的不受信任的文档中.")}}

我不确定,但我认为可以解决这个问题

eri*_*hak 2

好吧,最后我发现,尽管您只更改文档,但窗口事件会被删除,因为它们位于文档内部。

我遇到了 History.js 的问题,我认为是因为我更改文档的事实在某些时候打破了它。

我所做的是使用本机 HTML5 历史记录 API 并popstate在新文档中重新绑定该事件。