关于 History API 的一个小 demo

2017/05/30 | 1分钟阅读 | 更新于 2017/05/30

注意:原文中提到的域名已经无法访问了。

今天了解了一下 History API,写了个页面路由 Demo,支持具名路径。

大致长这个样子

在线查看 https://nil.red/s/demo/history.html

原理上 path 对应的内容是固定的,通过监听 onpopstate 或者其它触发 path 变动的事件,去更新页面为 path 对应的内容。

部分代码

const $ = document.querySelector.bind(document),
  map = {
    "/": () => {
      $("#view").innerHTML = "Home";
    },
    "/posts/:id": (params) => {
      $("#view").innerHTML = `Post: id=[${params.id}]`;
    },
    "/about": () => {
      $("#view").innerHTML = "About";
    },
  };

init();

function init() {
  jump("/");
}

function jump(path) {
  window.history.pushState({ path: path }, null, path);
  open(path);
}

function compare(tmp, path) {
  /* ... */
}

function open(path) {
  for (key in map) {
    let _res = compare(key, path);
    if (_res === null) {
      continue;
    } else {
      map[key](_res);
    }
  }
}

$("#menu").addEventListener("click", (e) => {
  let path = e.target.getAttribute("data-path");
  if (path != null) {
    jump(path);
  }
});

window.onpopstate = function (e) {
  open(e.state.path);
};

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!