Rafraichissement de page récalcitrant en javascript
Récemment lors d’un projet, je devais recharger une page suite à une mécanique ajax que je ne pouvais modifier, mais lorsque j’envoyais le rechargement de page en utilisant par exemple :
window.location.href = window.location.href;
Les données ne se rechargeaient par correctement, les anciennes données bien que modifiées dans la base grâce au script ajax n’étaient pas prises en compte lorsque la page était à nouveau affichée.
J’ai testé :
window.location.reload(true);
sans succès
J’ai cherché plusieurs méthodes, utilisé un suffixe comme on le fait pour recharger des fichiers images, js ou css :
window.location.href = window.location.href+'?refresh';
Mais rien, toujours ce problème d’affichage.
Lorsque je recharge cette url néanmoins, j’ai un élément qui va me permettre de feinter, lorsque la page se charge, je teste si le suffixe est présent, si c’est le cas, je recharge à nouveau l’url de base :
$(document).ready(function() { // Send refresh second time to avoid display errors if (window.location.href.indexOf('?refresh') != -1) { window.location.href = window.location.href.replace('?refresh', ''); return; } });
Le tour est joué, la page se recharge une nouvelle fois avec mise à jour des données comme il faut.
Le code complet est donc de la forme suivante :
$(document).ready(function() { // Send refresh second time to avoid display errors if (window.location.href.indexOf('?refresh') != -1) { window.location.href = window.location.href.replace('?refresh', ''); return; } }); // Base function that calls the first refresh function toto() { ... window.location.href = window.location.href+'?refresh'; }
Attention, pour utiliser cette méthode, il faut maitriser complètement son environ, c’est important surtout pour le suffixe, car si une url contient déjà un ?, ça ne fonctionnera pas, il faudra dans ce cas remplacer :
&refresh
par :
?refresh
De plus la page se recharge 2 fois ce qui augmente le nombre de requêtes et charge le serveur, du coup cette solution est à utiliser avec parcimonie.
Idem j’ai mélangé du jQuery et du javascript du fait de mes impératifs.