我希望能够添加locationchange 事件侦听器。经过下面的修改,我们就可以做到了,像这样
window.addEventListener('locationchange', function(){
console.log('location changed!');
})
相比之下,window.addEventListener('hashchange',()=>{}) 只会在 url 中标签后的部分发生更改时触发,而window.addEventListener('popstate',()=>{}) 并不总是有效。
这个修改,类似于Christian's answer,修改了历史对象,增加了一些功能。
默认情况下,在这些修改之前,有一个popstate 事件,但没有pushstate 和replacestate 的事件。
这会修改这三个函数,以便都触发一个自定义的locationchange 事件供您使用,如果您想使用它们,还可以触发pushstate 和replacestate 事件。
这些是修改:
history.pushState = ( f => function pushState(){
var ret = f.apply(this, arguments);
window.dispatchEvent(new Event('pushstate'));
window.dispatchEvent(new Event('locationchange'));
return ret;
})(history.pushState);
history.replaceState = ( f => function replaceState(){
var ret = f.apply(this, arguments);
window.dispatchEvent(new Event('replacestate'));
window.dispatchEvent(new Event('locationchange'));
return ret;
})(history.replaceState);
window.addEventListener('popstate',()=>{
window.dispatchEvent(new Event('locationchange'))
});
注意:
我们正在创建一个closure,old = (f=>function new(){f();...})(old) 将 old 替换为 new 函数,该函数包含之前保存的 old(old 目前未运行,但它将在new 内部运行)