[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();
}
复制代码

 

posted @   Zhentiw  阅读(76)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-12-15 [Java Spring MVC] @PathVariable, @Vallidated, @PostMapping & @ResponseStatus
2020-12-15 [Java Spring] @Embeddable and @EmbeddedId
2019-12-15 [Algorithm] 53. Maximum Subarray
2018-12-15 [Algorithm] Breadth First JavaScript Search Algorithm for Graphs
2018-12-15 [Algorithm] JavaScript Graph Data Structure
2017-12-15 [Python] Read and plot data from csv file
2017-12-15 [React] Make Controlled React Components with Control Props
点击右上角即可分享
微信分享提示