5 votes

Deux clics sur le bouton "retour" sont nécessaires pour déclencher l'événement "popstate/statechange".

J'ai une page qui contient une iframe. L'iframe peut prendre en compte les données de l'utilisateur (via un clic sur un bouton ou la sélection d'un menu) et afficher le contenu en conséquence. Ce dont j'ai besoin, c'est que lorsqu'un utilisateur manipule l'iframe, le navigateur enregistre chaque ensemble de paramètres de l'iframe dans l'historique ; et lorsque l'utilisateur clique sur le bouton retour, l'iframe recharge son contenu en utilisant les paramètres enregistrés à partir de l'entrée précédente de l'historique. J'ai un morceau de code qui effectue le rechargement comme indiqué ci-dessous.

Ce qui est étrange, c'est que lorsque j'effectue plusieurs réglages sur l'iframe (d'où plusieurs entrées d'état ajoutées à l'historique), et que je clique ensuite sur retour, cela fonctionne comme suit,

Disons que j'ai les états 4, 3, 2 en histoire et que je suis maintenant à l'état 5.

  1. le premier clic rétablit l'état 4 (le message de journalisation "----state changed----" s'imprime
  2. le second clic recharge l'iframe avec le contenu par défaut. Le message "----state changed----" n'est pas imprimé ; le code de rechargement n'est pas appelé.
  3. le troisième clic rétablit l'état 3
  4. le quatrième clic est comme le deuxième clic
  5. le 5ème clic rétablit l'état 2

Ainsi, après chaque clic qui rétablit l'état, il faut deux clics pour déclencher l'événement popstate (j'ai également essayé l'événement statechanged, avec le même résultat) et rétablir un autre état antérieur.

Quelqu'un sait-il ce qui se passe ici ? Merci d'avance.

History.Adapter.bind(window, "popstate",
    function (event) {
        console.log("----state changed------", History.getState());   
        console.log("----state data------",History.getState().data.state);  

           //code to do reload an iframe to its proper state

    });

4voto

Kevin Points 527

Je suis donc tombé sur le même problème. La situation que nous avions était l'utilisation de history.pushState() pour mettre à jour l'URL, puis en changeant l'élément src de l'attribut <iframe> . En modifiant le src de la <iframe> nous demandons implicitement au navigateur d'ajouter à son historique que l'iframe a changé. Ainsi...

  1. Lorsque nous avons appuyé sur le bouton la première fois, window.history L'état de la population est est déclenché sur le <iframe> et est ramené à son état précédent.
  2. En appuyant une deuxième fois sur la touche retour, on déclenche la popstate pour l'état que vous avez initialement poussé sur la pile

Notre solution consistait à faire en sorte que lorsque nous décidions de mettre à jour l'URL et de pousser l'état sur la pile, lorsque nous voulions mettre à jour l'élément <iframe> Nous avons utilisé jQuery pour remplacer le fichier <iframe> liste donc...

$("#iFrameID").replaceWith(('<iframe id="iFrameID" src="' + location + '"></iframe>'

Ce faisant, nous avons éliminé l'effet secondaire de la pollution de l'historique du navigateur par notre mise à jour de l'élément <iframe> étiquette.

0voto

user3918128 Points 91

J'ai eu le même problème : au lieu de renvoyer l'utilisateur à la page précédente du site web, le bouton "retour" renvoyait l'utilisateur à la page précédente à l'intérieur de l'iframe. Le code ci-dessous vous aidera à résoudre votre problème :

iframe.contentWindow.location.replace(href)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X