Ao fazer uma pequena extensão do Chrome, enfrentei o mesmo problema com um problema adicional: às vezes, a página muda, mas não o URL.
Por exemplo, basta ir à página inicial do Facebook e clicar no botão 'Página inicial'. Você recarregará a página, mas o URL não será alterado (estilo de aplicativo de uma página).
Em 99% do tempo, estamos desenvolvendo sites para que possamos obter esses eventos de estruturas como Angular, React, Vue etc.
MAS , no meu caso de uma extensão do Chrome (no Vanilla JS), tive que ouvir um evento que será acionado para cada "alteração de página", que geralmente pode ser detectada pela alteração de URL, mas às vezes não.
Minha solução caseira foi a seguinte:
listen(window.history.length);
var oldLength = -1;
function listen(currentLength) {
if (currentLength != oldLength) {
// Do your stuff here
}
oldLength = window.history.length;
setTimeout(function () {
listen(window.history.length);
}, 1000);
}
Então, basicamente, a solução leoneckert, aplicada ao histórico da janela, que muda quando uma página é alterada em um aplicativo de página única.
Não é ciência de foguetes, mas a solução mais limpa que encontrei, considerando que estamos apenas verificando uma igualdade de números aqui, e não objetos maiores ou todo o DOM.