[Javascript] History API
const players = [ { id: 'x9Opl1', name: 'Mario', bio: 'Italian plumber and lead character', }, { id: '7fGlZ0', name: 'Luigi', bio: "Mario's green younger brother", }, { id: 'y0SH11', name: 'Yoshi', bio: 'Green dinosaur turns enemies into eggs', }, { id: 'a8Pxia', name: 'Wario', bio: "Mario's yellow and purple arch-rival", }, ]; const app = document.getElementById('app'); app.innerHTML = ` <h1>JavaScript HTML5 APIs</h1> <nav class="links"> ${players.map((player) => `<a href="/${player.id}">${player.name}</a>`)} </nav> <div class="info"></div> <button type="button" class="back">Back</button> <button type="button" class="forward">Forward</button> `; const info = document.querySelector('.info'); const links = [...document.querySelectorAll('.links a')]; const back = document.querySelector('.back'); const forward = document.querySelector('.forward'); const render = (state) => { info.innerHTML = ` <h3>${state.name}</h3> <p>${state.bio}</p> `; }; const pushDefaultState = () => { const player = players[0]; history.replaceState(player, '', player.id); render(player); }; const init = () => { if (location.pathname === '/') { pushDefaultState(); return; } const id = location.pathname.substring(1); const player = players.find((player) => player.id === id); render(player); }; back.addEventListener('click', () => history.go(-1)); forward.addEventListener('click', () => history.go(1)); links.forEach((link) => { link.addEventListener('click', (e) => { e.preventDefault(); const id = e.target.getAttribute('href').substring(1); const player = players.find((player) => player.id === id); history.pushState(player, '', player.id); render(player); }); }); window.addEventListener('popstate', (e) => { if (!e.state) { pushDefaultState(); return; } const player = e.state; render(player); }); if (window.history && window.history.pushState) { init(); }