A especificação do histórico do HTML5 é peculiar.
history.pushState()não despacha um popstateevento ou carrega uma nova página por si só. Era apenas para empurrar o estado para a história. Este é um recurso "desfazer" para aplicativos de página única. Você deve despachar manualmente um popstateevento ou usar history.go()para navegar para o novo estado. A idéia é que um roteador possa ouvir popstateeventos e fazer a navegação por você.
Algumas coisas a serem observadas:
history.pushState()e history.replaceState()não despache popstateeventos.
history.back(), history.forward()E as costas do navegador e botões de avançar fazer expedição popstateeventos.
history.go()e history.go(0)recarregue a página inteira e não envie popstateeventos.
history.go(-1)(voltar 1 página) e history.go(1)(avançar 1 página) enviam popstateeventos.
Você pode usar a API do histórico como esta para enviar um novo estado E enviar um evento popstate.
history.pushState({message:'New State!'}, 'New Title', '/link');
window.dispatchEvent(new PopStateEvent('popstate', {
bubbles: false,
cancelable: false,
state: history.state
}));
Em seguida, ouça popstateeventos com um roteador.