IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Remplacer l'adresse de la page en cours dans l'historique


Sujet :

JavaScript

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut Remplacer l'adresse de la page en cours dans l'historique
    Bonjour,

    Dans le site Web sur lequel je travaille, il est possible d'accéder à certaines pages après avoir rempli un formulaire. Problème : si l'utilisateur essaie plus tard de revenir sur cette page à l'aide du bouton back ou d'un marque-page, ça ne marchera pas : l'url de la page est l'url de validation du formulaire. Accéder directement à l'URL du formulaire ne permet pas au serveur de retrouver la page suivante, car elle dépend du contenu du formulaire. Je voudrais donc, quand la page suivante est chargée après validation du formulaire, remplacer l'adresse de la page par une URL permettant d'y accéder directement.

    J'ai pensé à window.history.pushState et window.history.replaceState, mais ces méthodes ne remplacent pas l'entrée de la page en cours dans l'historique : elles en ajoutent une nouvelle. Ça permet effectivement de revenir sur la page à l'aide du bouton back, mais si l'utilisateur clique une deuxième fois sur back, il se retrouve à nouveau sur l'adresse de validation du formulaire plutôt que sur le formulaire lui-même.

    Savez vous comment obtenir l'effet désiré?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Tu es sûr que tu utilises replaceState correctement ? D'après la doc :
    history.replaceState() fonctionne exactement comme history.pushState() hormis le fait que replaceState() modifie l'entrée courante de l'historique au lieu d'en créer une nouvelle.
    Voici un exemple d'appel à replaceState :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    history.replaceState(null, '', 'nouvelle-url');
    Cela dit, si la nouvelle URL correspond à une page pouvant être générée par le serveur – et c'est a priori ton cas, car tu veux permettre à tes utilisateurs de mettre l'URL en marque-page – l'utilisation de replaceState n'est pas forcément adéquate ici. Envisage une redirection plus classique : header('Location: ...') en PHP, ou un code 302 envoyé « à la main » depuis ton serveur, ou location.replace en JS.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Bonjour,

    Merci de votre réponse. Je ne suis pas sûr d'utiliser replaceState correctement puisque je n'obtiens pas l'effet désiré. J'ai essayé votre exemple mais le résultat est le même : deux entrées dans l'historique au lieu d'une. La redirection via le header ou location.replace provoque un rechargement de la page, ce que je souhaite éviter.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Mea culpa, je n'ai pas vérifié tous les aspects de l'historique… Je pensais à l'historique qui apparaît quand on fait un clic droit sur le bouton « précédent ». Dans cet aspect, on constate bien la différence de comportement entre pushState et replaceState. Cependant, dans l'historique « global » du navigateur, qui apparaît par exemple en faisant Ctrl+H, on a une nouvelle entrée dans les deux cas. Je ne sais pas comment remédier à ce problème.

    Je te propose une autre approche. Intercepte la soumission classique du formulaire et remplace-la par un appel Ajax. Tu récupères ainsi le message de validation du formulaire dans la réponse Ajax, et tu peux rediriger ensuite l'utilisateur vers la page suivante, celle qui a une adresse permanente, avec location.replace. De cette manière la page de validation n'apparaît pas dans l'historique.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    C'est une bonne idée, ça implique un appel au serveur supplémentaire, mais on obtient l'effet désiré.

    Ceci dit, il faudrait réécrire beaucoup trop de code pour utiliser cette idée sur le projet en cours, et il faudrait me passer de la gestion des formulaires de Spring MVC. Je vais donc garder cette idée en réserve pour une autre application.

    Pour ce projet, je vais accepter que l'adresse de validation du formulaire apparaisse dans l'historique.

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Ceci dit, il faudrait réécrire beaucoup trop de code pour utiliser cette idée sur le projet en cours, et il faudrait me passer de la gestion des formulaires de Spring MVC.
    Je ne suis pas convaincu. Si tu suis ces quelques étapes, ça ne fait que quelques lignes de code et le serveur ne voit pas la différence :
    1. intercepter l'évènement "submit" et l'annuler avec preventDefault
    2. sérialiser le formulaire avec un objet FormData (*)
    3. lancer une requête Ajax avec les données sérialisées dans le corps de la requête
    4. extraire l'URL qui t'intéresse de la réponse HTML avec une regexp bien pensée

    (*) Pour les navigateurs qui ne supportent pas FormData (IE<10), tu peux copier le outerHTML du formulaire dans une iframe invisible, soumettre la copie de formulaire et lire le innerHTML de l'iframe pour avoir la réponse du serveur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appliquer un style spécifique à la page en cours dans un menu include ?
    Par supunna dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 12/09/2012, 15h22
  2. faire ressortir le liens de la page en cours dans un menu
    Par Invité dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 27/12/2008, 13h00
  3. titre de la page en cours dans l'entête
    Par guillaume07 dans le forum Mise en forme
    Réponses: 7
    Dernier message: 07/08/2008, 13h43
  4. Pb de récupération d'adresse d'une page asp
    Par croco83 dans le forum ASP
    Réponses: 2
    Dernier message: 07/05/2004, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo