Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript观察URL中的更改?_Javascript_Events_Mutation Observers - Fatal编程技术网

如何使用JavaScript观察URL中的更改?

如何使用JavaScript观察URL中的更改?,javascript,events,mutation-observers,Javascript,Events,Mutation Observers,各国: 请注意,只需调用history.pushState()或 history.replaceState()不会触发popstate事件。这个 popstate事件将通过执行浏览器操作(如 单击后退或前进按钮(或调用history.back()或 history.forward()在JavaScript中) 我需要一种在URL更改时执行某些代码的方法,这种方法不会触发popstate事件(例如history.replaceState())。最好使用MutationObserver API[1]

各国:

请注意,只需调用
history.pushState()
history.replaceState()
不会触发
popstate
事件。这个
popstate
事件将通过执行浏览器操作(如 单击后退或前进按钮(或调用
history.back()
history.forward()
在JavaScript中)

我需要一种在URL更改时执行某些代码的方法,这种方法不会触发
popstate
事件(例如
history.replaceState()
)。最好使用MutationObserver API[1],而且最肯定的是不需要每隔x秒轮询URL

而且,我不会这样做,因为我必须对URL中的每一个更改采取行动,而不仅仅是哈希部分

可能吗


[1] 这解释了为什么MutationObserver API不适用于此


(其他)有关问题:

您需要重新定义(包装)其他脚本正在使用的
历史记录.replaceState

(function(){
  var rs = history.replaceState; 
  history.replaceState = function(){
    rs.apply(history, arguments); // preserve normal functionality
    console.log("navigating", arguments); // do something extra here; raise an event
  };
}());
没有投票,没有浪费,没有重写,没有麻烦


对pushState或编写用户脚本时希望/需要的任何其他本机(如ajax)执行相同的操作。

调用replaceState()时只需调用其他代码,或创建自定义事件并分派它即可。如果您不控制的代码调用它,请包装函数以实现最后一句话。但我不是调用
replaceState()
和类似函数的人。web应用程序代码是。(我正在写一个userscript)。你不能在加载其他代码之前运行userscript吗?大多数扩展都将此作为一种设置。您可以在一段时间内连续轮询,但不希望这种状态一直在后台运行/消耗?(只是在想)@dandavis是的,我目前正在这样做,但是脚本只加载了一次(当页面第一次加载时)。如果应用程序更改了自己的URL,我的脚本必须检测到它,这就是我要做的。OP需要对
pushState
,以及类似于
location
location.href
,等等做同样的操作。@Hereticsmonkey:不,更改
location.href
将重新加载页面并销毁脚本变量(尽管用户脚本仍会像往常一样在页面加载时启动)。我在回答中提到了pushState…是的,我有点惊讶没有人在问题中注意到这一点。我也可以直接输入地址栏…我会在几个小时后回来测试这个;谢谢你的回答。这不是我在生产代码库中使用的模式,因为远程可能存在性能或兼容性问题,但对于用户脚本来说,它是完美的。当JS不能提供你想要的东西时,有时你不得不作弊。。。