History.pushstate有回调函数吗?

18

我的谷歌搜索没有找到任何结果。

当你这样做时:

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

有关联的窗口回调函数吗?

我知道有这个:

window.onpopstate = function() {

}

对于监听用户点击返回按钮的情况,它非常有效。但我想监听任何时候URL发生的变化,我不确定该怎么做。

是否有一个全局回调函数来监听任何时候URL发生的变化?


https://dev59.com/zXRB5IYBdhLWcg3wQFLu - Joe
尝试将其绑定到一个元素上,然后检查值的类型(typeof elem.onpopstate),如果它是未定义的,则不支持,如果它是一个函数则没问题。请参考http://perfectionkills.com/detecting-event-support-without-browser-sniffing/了解如何检测事件支持而无需使用浏览器嗅探。 - GillesC
2
可能是重复的问题:如何通过history.pushState获取有关历史更改的通知? - thekevinscott
1
可能是On - window.location.hash - Change?的重复问题。 - Michael Coxon
1个回答

35

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

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

只有在使用pushState时,才会收到通知。如果您需要在URL发生任何更改时被通知,可以将上述内容与hashchange处理程序相结合,这将让您完成大部分工作。


4
你知道吗,这个问题几乎完全相同,答案也一样。:P - Peter C
这会给你带来任何麻烦吗?例如,在加载脚本的第三方网站上执行此操作。还是说这基本上是安全的? - Cristian
我发现一个例子,这种方法可能行不通。例如,在Backbone.history中,history.pushState的引用被复制到Backbone.history.pushState。如果我们使用=赋值替换window.history.pushState的引用,那么你仍然会有Backbone.history.pushState引用旧的pushState,因此你的猴子补丁代码不会被调用。如果JS内置了引用管理就好了:( - Cristian
使用它会是什么样子? - SeanMC
@Cristian 如果你想这样做,你应该使用上面装饰过的方法来设置 Backbone.history.pushState - Nick Bull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接