history-change: 检测 history 的变化(url)
一个可以检测URL变化的库,利用 hashchange/popstate 来实现
项目主页: https://github.com/afeiship/history-change
安装
yarn add @jswork/history-change
直接浏览器使用
<script src="https://unpkg.com/@jswork/history-change"></script>
用法
类 node 环境
import HistoryChange from '@jswork/history-change';
// app init
HistoryChange.init('hash');
// listen
window.addEventListener('historychange', (e) => {
const { action, history } = e.detail;
console.log('action/history :', action, history);
});
线上资源
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HistoryChange online version</title>
<script src="https://unpkg.com/@jswork/history-change"></script>
</head>
<body>
<nav>
<a href="#1">111</a>
<a href="#2">222</a>
<a href="#3">333</a>
<a href="#4">444</a>
</nav>
<script>
HistoryChange.init('hash');
window.addEventListener('historychange', (e) => {
const { action, history } = e.detail;
console.log('action/history :', action, history);
});
</script>
</body>
</html>
预览
- https://afeiship.github.io/history-change/
- https://afeiship.github.io/history-change/hash
- https://afeiship.github.io/history-change/browser
已知
- hash 情况下: 实际上检测
replace
和back
逻辑有问题 - 用户直接操作浏览器的前进/后退,所引起的
pop/push/replace
都不准确 - 本来想通过 location.replace 方法的改写,来实现 replace 方法的监听,发现这个思路行不通(Object.getOwnPropertyDescriptor 得知
知识点
- Object.getOwnPropertyDescriptor: 用来获取原有属性是否可改写等信息
扩展
- rewrite 方法
- aop 可拦截的方法、属性
cheatsheet
知识点 | 详情 |
---|---|
replace 为什么不能改写 |
|
replaceState 可以改写 |
|
replace 与 back 无法区分的场景 |
|