IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Javascript et historique navigateur, history.pushstate
Options
toluol
posté 2 May 2014, 20:15
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Bonsoir,

je développe de plus en plus de sites avec des parties en ajax, mais je ne parviens toujours pas à utiliser la méthode pushstate pour conserver un historique dans le navigateur.
Le principe que j'utilise est très basique : un lien <a> est ciblé en jquery et celui-ci utilise de l'ajax pour me retourner l'html qui va me permettre de modifier ma partie de page. J'ai donc un "return false;" dans ma fonction pour bloquer l'action naturelle du lien par le navigateur. Mais ce lien existe bien évidemment, et c'est que je souhaite "stocker" avec le pushstate.

Pour l'instant, cela "stocke" bien mes urls, et quand je clique sur les boutons "back" et "forward" du navigateur, l'url change (et le title aussi, si je veux), mais il n'y a pas un rechargement de la page au clic de ces boutons ! Et ce, quelque soit le navigateur. Pourriez-vous m'éclairer sur ce problème ?

voici le code de mon bouton "épuré"...

Code
     $('a#test').click(function(){

                    var vars = $(this).attr('variables');

                    $.ajax({
                    type: 'POST',
                    url: 'update.php',
                    data: "vars="+ variables,
                    dataType:'text',
                    success: function(data){
                        var tabData = data.split(";;");
                        var html = tabData[0];
                        var title = tabData[1];
                        var url = tabData[2];
                        
                        document.title = title_nav;
                        window.history.pushState(null,title_nav, url_nav);                    
                    },    
                    error: function() {alert('erreur serveur');}
                    });

                return false;
     });


Go to the top of the page
 
+Quote Post
toluol
posté 4 May 2014, 20:11
Message #2


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Eh ben, je bloque toujours... sad.gif J'ai beau chercher, mais toujours aucune piste.
Go to the top of the page
 
+Quote Post
yponomeute
posté 5 May 2014, 06:21
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 969
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



Hello,

J'ai pas encore mis ça en oeuvre pour l'instant, mais d'après ce que j'ai compris il faut utiliser onpostate pour détecter le clic sur un bouton précédent ou suivant du navigateur et ensuite déclencher la mise à jour de la page : https://developer.mozilla.org/fr/docs/DOM/window.onpopstate


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
marc_os
posté 6 May 2014, 11:37
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 484
Inscrit : 21 Apr 2006
Membre no 59 799



Je n'ai pas bien compris ton problème, en particulier le rapport entre le code JS de ton lien a#test et les boutons Précédent et Suivant du navigateur.

Ceci dit, il est normal que les navigateurs ne rechargent pas une page affichée via les boutons Précédent et Suivant car ils la récupèrent depuis le cache du navigateur. Donc, si tu veux que la page soit rechargée, une solution pourrait être d'empêcher le navigateur de mettre les pages en question en cache, par exemple grâce aux appels suivants au début du code php qui génère la page :

Code
header("Cache-Control: no-cache");
header("Pragma: no-cache");

A tester…

Autre remarque : Si ton lien a#test se trouve sur un élément réagissant aux clics via par exemple :
Code
$('div#testConteneur').click(function(){
     /* ... */
});

alors ce code sera exécuté aussi. Pour éviter cela, ajouter event.stopPropagation(); au début de ton code :

Code
$('a#test').click(function(event){ // ne pas oublier de mettre 'event' en paramètre
    event.stopPropagation();

    var vars = $(this).attr('variables');
    /* ... */
});


--------------------
-----------------
--JE-------SUIS--
--AHMED-CHARLIE--
--CLARISSA-YOAV--
-----------------
Go to the top of the page
 
+Quote Post
toluol
posté 27 May 2014, 20:04
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Désolé à yponomeute et marc_os pour ma lente réponse. J'ai eu un problème de notification de réponse.

En fait, je crois justement que mon problème vient justement du fait que rien n'est mis en cache...

Pour résumer :
Avant que j'essaie de mettre en place un historique
1. Je suis sur google (historique 1)
2. Je charge ma page où il y a mon site. (historique 2)
3. Je clique sur mon bouton (ou mon div) qui appelle une fonction ajax qui modifie une partie de ma page...
Cela n'est pas mis en cache (...enfin... il me semble) par le navigateur. (état 3, mais non enregistré)
4. Si je clique sur le bouton "revenir en arrière" du navigateur, de l'état 3 de la page, je retourne à l'historique 1...
car il n'a pas enregistré l'historique 3 (un état de la page modifié par javascript)

En utilisant pushState, j'espérais...
1. être sur google (historique 1)
2. charger ma page où il y a mon site. (historique 2)
3. cliquer sur mon bouton (ou div) qui appelle une fonction ajax qui modifie une partie de ma page... (état 3, pushstate enregistre "pageA.html")
4. cliquer sur un 2e bouton (ou div) qui appelle une fois encore ma fonction ajax... (état 4, pushstate enregistre "pageB.html")
5. Si je clique sur le bouton "revenir en arrière" du navigateur, de l'état 4 (mis en forme par javascript et étant la même page que pageB.html), je pensais lancer pageA.html

Hélas... si mon code enregistre pageA.html et pageB.html dans l'historique, le seul clic ne suffit pas à "revenir à l'état précédent"... (Je dois relancer la page)

Et c'est la que je suis perdu car je ne comprends pas la méthode ! A quoi sert la méthode pushState si ce n'est pour enregistrer des urls "en dur" qu'on peut relancer ?
Permet-elle d'enregistrer dans le cache la page modifiée ?



Go to the top of the page
 
+Quote Post
No6
posté 28 May 2014, 04:02
Message #6


Oui ?
*****

Groupe : Membres
Messages : 3 889
Inscrit : 24 Jun 2003
Lieu : BZH
Membre no 8 224



Ya un truc qui me chiffonne dans ton code:
pour moi, le fait d'avoir un return false; sur le click du lien le rend inopérant non ???


--------------------
"Je sais que vous croyez comprendre ce que vous pensez que j'ai dit, mais je ne suis pas sûr que vous réalisiez que ce que vous avez entendu n'est pas ce que je pense."
(Alan Greenspan)
Go to the top of the page
 
+Quote Post
toluol
posté 28 May 2014, 09:10
Message #7


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



C'est le but... Sinon ma page se rechargerait et je ne pourrais pas faire tout ce que je veux en javascript.
Le code que j'ai montré est un code simplifié, mais il y a des animations qui ne se feraient pas si c'était un lien normal.
Ce serait plus simple de vous montrer le site, mais je ne veux pas faire de pub. Je peux éventuellement le transmettre par MP.
Go to the top of the page
 
+Quote Post
yponomeute
posté 28 May 2014, 09:31
Message #8


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 969
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



D'après ce que j'ai lu sur le sujet, j'ai compris qu'il faut détecter la navigation arrière dans l'historique (bouton précédent) avec window.onpopstate, et ensuite executer l'appel ajax qui correspond. Le navigateur ne relançant pas de lui même les appels ajax. Mais ça reste du domaine de la théorie pour moi, j'essayerai de faire des tests quand mon planning pro sera un peu moins touffu.


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
toluol
posté 28 May 2014, 09:36
Message #9


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 792
Inscrit : 14 Nov 2003
Lieu : Genève
Membre no 11 656



Ok, merci pour cette piste qui me semble prometteuse... Je vais aussi essayer de faire des tests
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 23rd April 2024 - 09:01