Aller au contenu

API History JavaScript

Introduction à l'API History JavaScript

Dans le développement web moderne, la création d'expériences utilisateur fluides implique souvent la manipulation de l'historique du navigateur. L'API History de JavaScript fournit les outils nécessaires à cette tâche, permettant une gestion sophistiquée des sessions de navigation. En utilisant cette API, les développeurs peuvent améliorer les fonctionnalités de navigation au sein des applications monopages (SPA) sans recharger entièrement la page, garantissant ainsi une expérience utilisateur plus fluide.

Utilisation de l'API History dans les applications web

L'API History permet de naviguer entre différents états d'une application sans recharger la page. Voici comment ajouter un nouvel état :


html
<div>
    <button onclick="changeState()">Go to New State</button>
</div>

<script>
    // Function to change state
    function changeState() {
        const newState = { id: 'newState' };
        // Push a new state to the history stack
        window.history.pushState(newState, 'New State', 'new-state-url');
    }
</script>

Cet extrait de code montre comment ajouter un nouvel état à la pile d'historique en utilisant pushState(). C'est un moyen simple de naviguer sans recharger la page.

Gestion de l'événement popstate

Lorsque les utilisateurs cliquent sur les boutons retour ou avant du navigateur, l'événement popstate se déclenche. Il est essentiel de le gérer pour restaurer correctement l'état de l'application :


javascript
window.addEventListener('popstate', function(event) {
        if(event.state) {
            console.log('State changed:', event.state);
            // Handle the state object here
        }
    });

Ce gestionnaire réagit aux événements popstate, consigne les modifications et permet d'ajuster l'état en fonction de l'historique de navigation de l'utilisateur.

Remplacement de l'état actuel

Parfois, il est nécessaire de mettre à jour l'état actuel sans ajouter un nouvel enregistrement à la pile d'historique. Cela se fait à l'aide de la méthode replaceState() :


html
<div>
    <button onclick="replaceCurrentState()">Replace State</button>
    <p id="replace-status">Ready</p>
</div>

<script>
    function replaceCurrentState() {
        const newState = { id: 'replacedState' };
        // Replace the current state
        window.history.replaceState(newState, 'Replaced State', 'replaced-state-url');
        document.getElementById('replace-status').textContent = 'State replaced successfully!';
    }
</script>

Cet exemple montre comment mettre à jour l'état actuel dans la pile d'historique, utile pour mettre à jour les URL ou les informations d'état sans navigation.

Exemple complet Maintenant, réunissons le tout et voyons l'API History en action. L'exemple ci-dessous simule le comportement de l'API History du navigateur dans une application monopage (SPA). Cette démonstration vous aide à comprendre comment les SPA peuvent gérer l'historique de navigation de manière transparente, permettant aux utilisateurs de naviguer entre des « pages » sans recharger le site web. C'est une méthode pratique pour voir comment les applications web modernes gèrent les interactions des utilisateurs avec l'historique du navigateur.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>SPA Style History API Example</title>
</head>
<body>
    <h1>Page Navigation with History API</h1>
    <div id="content">Start Page</div>

    <!-- Buttons for navigation -->
    <button onclick="loadPage('page1')">Load Page 1</button>
    <button onclick="loadPage('page2')">Load Page 2</button>
    <button onclick="manualGoBack()">Go Back</button>
    <button onclick="manualGoForward()">Go Forward</button>

    <!-- Display the current status of the history -->
    <p id="historyStatus">History Status: Start</p>

    <script>
        // Loads a "page" and updates the browser's history state
        function loadPage(page) {
            const state = { page: page }; // State to be pushed to history
            history.pushState(state, `Page ${page}`, `${page}.html`); // Pushing state to the history
            document.getElementById('content').innerHTML = `<h2>This is ${page.replace('page', 'Page ')}</h2>`; // Update the content
            updateHistoryStatus(state); // Update the history status display
        }

        // Handles the browser's back and forward button actions
        window.addEventListener('popstate', function(event) {
            if (event.state) {
                // Update the page content and history status when navigating through history
                document.getElementById('content').innerHTML = `<h2>This is ${event.state.page.replace('page', 'Page ')}</h2>`;
                updateHistoryStatus(event.state);
            } else {
                // Fallback content when the history does not have any state
                document.getElementById('content').innerHTML = `<h2>Start Page</h2>`;
                document.getElementById('historyStatus').textContent = "History Status: Start";
            }
        });

        // Updates the display of the current history status
        function updateHistoryStatus(state) {
            document.getElementById('historyStatus').textContent = `History Status: ${state.page}`;
        }

        // Function to manually trigger going back in history
        function manualGoBack() {
            history.back();
        }

        // Function to manually trigger going forward in history
        function manualGoForward() {
            history.forward();
        }
    </script>
</body>
</html>

Explication : - Chargement dynamique des pages : Cet exemple simule la navigation vers différentes « pages » au sein d'une application monopage en modifiant le contenu d'un div et en mettant à jour l'URL à l'aide de l'API History.

  • API History : Elle utilise history.pushState pour ajouter des entrées à l'historique et répond à l'événement popstate pour gérer la navigation retour et avant.
  • Interface utilisateur : Fournit des boutons pour charger de nouvelles « pages » et naviguer vers l'avant et l'arrière, rendant la navigation similaire à celle d'un site web multi-pages mais sans rechargements complets de page.

Cette configuration démontre l'utilisation pratique de l'API History dans la création d'applications web dynamiques et conviviales qui conservent une expérience de navigation familière.

Bonnes pratiques pour utiliser l'API History

  • Cohérence : Assurez un comportement cohérent sur tous les navigateurs en vérifiant que la gestion des états fonctionne de manière uniforme.
  • Compatibilité universelle : L'API History est prise en charge par tous les navigateurs modernes, de sorte que des solutions de repli explicites sont rarement nécessaires aujourd'hui.
  • Gestion des états : Soyez rigoureux avec les objets d'état pour éviter les fuites de mémoire et garantir qu'ils ne consomment pas une quantité excessive de mémoire.
  • Inspection de l'historique : Utilisez history.state pour accéder à l'objet d'état actuel et history.length pour vérifier le nombre d'entrées dans la pile d'historique de session.

Conclusion

L'API History JavaScript est un outil robuste pour améliorer la navigation et la gestion des états dans les applications web. En tirant parti de ses fonctionnalités, les développeurs peuvent créer des applications web plus dynamiques, rapides et conviviales. Comprendre et implémenter l'API History permet de manipuler la pile d'historique du navigateur de manière à améliorer l'expérience utilisateur tout en préservant l'intégrité de l'état de la session.

Pratique

Parmi les éléments suivants, lesquels sont des fonctionnalités de l'API History JavaScript ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.