嘿,我statechange
在窗口上设置了以下事件:
History.Adapter.bind(window,'statechange',function(e){
console.log("statechange event occured ");
//more code
var newDoc = document.open();
newDoc.write(file);
newDoc.close();
});
我正在使用history.js,但在这种情况下这并不重要,因为它会定期绑定statechange,我得到file
like 的值应该是并且工作正常。
现在我在外部 js 文件中有这段代码(和其他代码),在文件中我正在遍历所有a
标签并应用以下点击事件:
$(element).on("click",function(e){
e.preventDefault();
//more code
History.pushState({file : file},title, fullHref);
});
现在,当我单击文档时,文档会按预期进行更改,但是当尝试使用后退/前进按钮时,statechange
事件不会触发。
我应该提一下,这个 js 也包含在我正在加载的文件中。
所以我最初的想法是,当文档发生变化但窗口没有变化时,事件仍然存在。这是不正确的,因为它多次应用 statechange 事件。所以我尝试使用 cookie 应用一次事件,但仍然做同样的事情。
现在,如果我不更改文档,而是简单地使用 jQuery 应用它,那么 statechange.html()
事件会按预期触发,所以我猜它与文档有关。
为什么会发生这种情况?我相信如果我更多地了解更改文档时窗口事件会发生什么,我可以解决这个问题。
尝试:
- 我现在也尝试
popstate
通过常规的 History API 绑定到事件,仍然给出或接受相同的结果。pushState
不会触发 popstate 但后退按钮会触发但没有状态。 - 我得出的结论是,我不应该使用 history.js,因为我怀疑问题来自那里,所以我“解决”了我的 popstate 问题,这仍然导致问题,因为 document.open 似乎正在触发 popstate。仍在寻找更多信息
- 我试过使用
on
,同样的结果
资料:
- 我们使用历史的这个例子是因为 history.js,如果我使用常规的历史 API 仍然存在同样的问题。
我在 mdn 中读到:
{{ gecko_minversion_note("1.9.2", "从 Gecko 1.9.2 开始,document.open() 使用
它使用其 URI 的文档的主体,而不是从堆栈中获取主体。因此,即使使用 WrappedJSObject,您也不能再将 document.write() 从 chrome 调用到不受信任的文档中。") }}
我不确定,但我认为可以解决这个问题