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

时间:2012-11-21 12:05:51

标签: 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();
});

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

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

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

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


});

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

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

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

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

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

尝试:

  • 我现在也尝试通过常规历史记录API绑定到popstate事件,但仍然提供相同的结果。 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的文档的主体,而不是获取   主要的筹码。结果,您无法再打电话   document.write()从chrome转换为不受信任的文档,甚至使用   wrappedJSObject。“)}}

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

4 个答案:

答案 0 :(得分:2)

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

我用History.js来解决我的问题,我认为因为我改变文件的事实在某些时候打破了它。

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

答案 1 :(得分: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);
    });

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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