【问题标题】:what happens to window events when changing documents?更改文档时窗口事件会发生什么?
【发布时间】:2012-11-09 16:21:15
【问题描述】:

嘿,我在窗口上设置了以下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 事件会按预期触发,所以我猜它与文档有关。

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

尝试:

  • 我现在还尝试通过常规的 History API 绑定到 popstate 事件,结果仍然相同。 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 的文档的主体,而不是获取 本金出栈。结果,您不能再调用 document.write() 从 chrome 到一个不受信任的文档,即使使用 WrappedJSObject。") }}

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

【问题讨论】:

    标签: javascript jquery html dom browser-history


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您是否尝试将元素与 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);
          });
      

      【讨论】:

      • live 不再使用,您现在应该使用on,是的,我确实没有帮助。使用click 只是我的尝试之一。
      【解决方案3】:

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

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

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

      【讨论】:

      • 我不have 使用 iframe,我不能使用 iframe。当我使用document.open() 时,我的点击事件确实发生了
      【解决方案4】:

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

      【讨论】:

      • w3schools 中的信息不可靠,其他网站如 mdn 没有提及这些属性。
      • 您是否尝试在单击时跟踪 History 对象,以便查看该对象是否与根级别的 History 对象相同?
      • 不,我没有,但它无关紧要,因为我最终解决了它,谢谢你的帮助!
      • 我认为 History 对象在覆盖文档时会被丢弃,因为它可能附加到 DOM,但本机历史 API 可能绑定得更高......很高兴看到你找到了修复它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多