14

嘿,我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,我得到filelike 的值应该是并且工作正常。

现在我在外部 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 调用到不受信任的文档中。") }}

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

4

4 回答 4

2

好吧,最后我发现虽然你只更改了文档,但窗口事件在文档中被删除了。

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

我所做的是使用原生 HTML5 历史 API 并popstate在新文档中重新绑定事件。

于 2012-11-27T09:13:06.973 回答
0

您是否尝试将元素与 LIVE 绑定?

$(element).click(function(e){
    e.preventDefault();
    //more code
    History.pushState({file : file},title, fullHref);
});

变成

$(element).live('click',function(e){
        e.preventDefault();
        //more code
        History.pushState({file : file},title, fullHref);
    });
于 2012-11-23T16:54:35.187 回答
0

您必须使用iframe来加载您的文档,并且可以轻松地更改其文档。然后,你可以监听这样的点击事件,

$("#iframe").load(function () {
    $(this.contentWindow).click(function () {
        // do your click events here
    });
});

src如果您将属性值更改为另一个文档,iframe 将重新加载。

于 2012-11-26T09:55:46.643 回答
0

您是否尝试过在 document.open() 方法中设置目标(请参阅 http://www.w3schools.com/jsref/met_doc_open.asp)?如果不是,您实际上是在写入一个空白窗口,您可能会丢失 History 对象。

于 2012-11-27T09:09:48.613 回答