Je voulais être capable d'ajouter locationchange
des écouteurs d'événements. Après la modification ci-dessous, nous serons en mesure de le faire, comme ceci
window.addEventListener('locationchange', function(){
console.log('location changed!');
})
En revanche, window.addEventListener('hashchange',()=>{})
ne se déclencherait que si la partie après un hashtag dans une url change, et window.addEventListener('popstate',()=>{})
ne fonctionne pas toujours.
Cette modification, similaire à Réponse de Christian modifie l'objet historique pour y ajouter certaines fonctionnalités.
Par défaut, avant ces modifications, il y a une popstate
mais il n'y a pas d'événement pour pushstate
et replacestate
.
Ces trois fonctions sont modifiées de manière à ce qu'elles déclenchent toutes une fonction personnalisée. locationchange
que vous pouvez utiliser, et aussi pushstate
et replacestate
si vous voulez les utiliser.
Voici les modifications :
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'))
});
Note :
Nous créons un fermeture , old = (f=>function new(){f();...})(old)
remplace old
avec un new
qui contient le précédent old
enregistré en son sein ( old
n'est pas exécuté pour le moment, mais il le sera à l'intérieur de l'application new
)
1 votes
Pour les futurs visiteurs, une nouvelle réponse de @aljgom de 2018 est la meilleure solution : stackoverflow.com/a/52809105/151503