【问题标题】:Is there a callback for History.pushstate?History.pushstate 有回调吗?
【发布时间】:2012-05-12 06:58:08
【问题描述】:

我的 Google-fu 什么也没有。

当你这样做时:

var stateObj = { state: "some state" };
history.pushState(stateObj, "page 2", "other.htm");

有关联的窗口回调吗?

我知道有这个:

window.onpopstate = function() {

}

当用户点击后退按钮时,这非常适合聆听。但是,我想在 URL 发生变化时随时收听,但我不知道该怎么做。

是否有针对任何时候 URL 更改的全局回调?

【问题讨论】:

标签: javascript html html5-history


【解决方案1】:

不,没有onpushstate 之类的。然而,一个小猴子补丁可以解决这个问题:

var pushState = history.pushState;
history.pushState = function () {
    pushState.apply(history, arguments);
    fireEvents('pushState', arguments);  // Some event-handling function
};

这只会在使用 pushState 时通知您。您可能想要为 replaceState 做类似的事情。

如果您需要在 URL 发生变化时收到通知,则上述的某种组合和 hashchange 处理程序将帮助您完成大部分工作。

【讨论】:

  • 你知道什么,this 问题几乎相同,答案也是如此。 :P
  • 这会给您带来麻烦吗?例如。在加载脚本的第三方网站上执行此操作。或者这主要是安全的吗?
  • 我发现了一个可能不起作用的例子。例如,在 Backbone.history 中,history.pushState 引用被复制到 Backbone.history.pushState。如果我们使用= 赋值替换window.history.pushState 的引用,那么您仍然会有Backbone.history.pushState 引用旧的pushState,因此不会调用您的猴子补丁代码。如果只有 JS 有内置的引用管理:(
  • 使用它会是什么样子?
  • @Cristian 如果你想这样做,你应该用上面的装饰方法设置Backbone.history.pushState
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多