bouton de retour dans le navigateur ne fonctionne pas correctement après avoir utilisé pushState (dans Chrome)
j'utilise ce type de ligne dans une réponse JS
if (history && history.pushState){
history.pushState(null, null, '<%=j home_path %>');
}
mais quand je clique sur back
dans le navigateur, je vois le code JS de la réponse au lieu de la page précédente.
y a-t-il un moyen de faire fonctionner le bouton arrière pour qu'il requière la page de la dernière url (avant home_path
comme pushStated in?
mise à Jour :
j'ai trouvé ceci .. il semble que d'autres ont le même problème avec.. Histoire.js ne le Répare pas non plus
donc pour confirmer certains des commentaires là.. Cela se produit seulement dans chrome
Ce que je pense
je pense que la racine de tout cela est que le popstate demande le même type de document pushstate (réponse js). Ce qui doit être fait est sur popstate demande la réponse html.. Je ne sais juste pas comment
autres mises à jour:
voir http://railscasts.com/episodes/246-ajax-history-state il mentionne d'utiliser
$(window).bind("popstate", function() {
$.getScript(location.href);
});
cela résout le problème mais selon comprendre jQuery $.getScript () sans la mise en cache ajax il va ajouter des horodateurs.. qui pollue l'url.. éteindre rend-il pas de travailler à nouveau avec le même effet..
Quelqu'un sait comment résoudre ce problème?
encore plus de mises à jour
j'ai suivi les pistes de la question partout dans l'interweb et a terminé avec un problème dans chrome qui pointe à un problème de rails (firefox fonctionne très bien cependant) et un problème dans rails-ujs concernant ne pas inclure L'en-tête Vary dans les réponses
exemple peut être trouvé ici
4 réponses
je suis en train de jouer avec le faire
response.headers['Vary'] = 'Accept'
qui semble résoudre le problème, à première vue.
Si quelqu'un a le même problème, s'il vous plaît vérifier et laissez-moi savoir
vous devez ajouter un auditeur à l'événement popstate
window.onpopstate = function(event) {
//load the page
};
lorsque le bouton Précédent est appuyé, l'url est changée et l'événement popstate est déclenché. Il est de votre responsabilité de charger les détails dans votre écouteur popstate qui correspondent à l'url modifiée.
un exemple d'état populaire de nice
certains navigateurs tirent un événement popstate lorsque la page se charge pour la première fois, provoquant une boucle de chargement de page infinie. Ceci peut être évité en ajoutant le contrôle suivant
var loadPage = window.history.state;
window.onpopstate = function(event) {
if (loadPage)
//load the page
};
définit alors la page de chargement à true quand pushState est appelé
history.pushState(null, null, '<%=j home_path %>');
loadPage = true;
cette technique fonctionne dans tous les navigateurs qui prennent en charge l'api HTML5 history.
C'est arrivé avec mon sinatra & chrome.
résolu avec:
$.ajaxSetup({ cache: false });
j'ai testé ce code sur mon navigateur en utilisant un fichier HTML local et j'ai eu une erreur de sécurité dans la console:
SecurityError: The operation is insecure.
history.pushState(null, null, '<%=j home_path %>');
je peux voir comment la manipulation de l'historique du navigateur peut être considérée comme un comportement potentiellement dangereux, donc je suppose que vous devriez vérifier que cela ne se produit pas pour vous aussi bien. Essayez D'utiliser la console Javascript Firebug. Il est également possible qu'il y ait des différences de comportement entre les fichiers locaux et http:// HTML.
Ceci dit, pour ce que j'ai vu, le dernier élément du tableau history
est essentiellement la page courante, donc si vous voulez changer la précédente, vous pouvez le faire en utilisant deux commandes pushState () - vous poussez d'abord l'élément précédent que vous désirez, puis vous poussez à nouveau le chemin courant. Si j'ai bien compris votre problème correctement.