Even if modifying build-in functions isn't good hack...
function insertOnUrlChange(parent, funcname) {
let oldFunc = parent[funcname] ? parent[funcname] : function (){}
parent[funcname] = function() {
oldFunc.apply(this, arguments)
return window.onurlchange()
}
}
insertOnUrlChange(window.history, "pushState")
insertOnUrlChange(window.history, "replaceState")
window.onurlchange = function() {
doSomething()
}
window.history.pushState(null, null, "/hoge#foo=bar") // doSomething()