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

24
demandé sur Mohsen Safari 2013-03-13 23:02:03

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

12
répondu Nick Ginanto 2013-04-04 07:28:35

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.

7
répondu graham mendick 2013-03-23 09:49:18

C'est arrivé avec mon sinatra & chrome.

résolu avec:

$.ajaxSetup({ cache: false });
1
répondu trompa 2013-07-03 19:10:03

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.

0
répondu Okarin 2013-03-19 09:46:01