History 是 window 对象中的一个 JavaScript 对象,它包含了关于浏览器会话历史的
History 对象包含长度属性,它包含了会话历史记录栈中的 URL 数量。例如,如果用户在浏览器中打开一个标签页,历史记录的长度将是 1(新的标签页也是一个网页)。 并点击回车,现在历史记录对象的长度将是 2, ,历史记录对象的长度将就是 3 了。
Back 和 Forward 方法
你可以使用 history 对象的 back 和 forward 方法来浏览网页。例如,如果你想转到上一个页面,那么可以使用:
history.back()
同样的,如果你想转到下一页,你可以使用:
history.forward()
Go 方法
如果您想向前或向后移动 n 个页面,那么您可以使用 go 方法:
history.go(-2) // 倒退 2 页 history.go(2) // 前进 2 页
所以 history.go(1) 和 history.forward() 效果是相同的,history.go(-1) 和 history.go(-1) 效果是相同的。history.go 方法的默认值为 0,如果不传任何数字,则当前页面会被刷新。
window.history.go(0) window.history.go()
PushState
你也可以使用 pushState 和 replaceState 方法改变页面的 URL。pushState 会改变页面的 URL,并将改变后的 URL 添加到 history 对象的 URL 栈顶部。语法如下:
history.pushState(state, title, url)
参数 state 是状态数据,它将被存储在 history.state 变量中。参数 title 是标题文本,不过它对大多数浏览器都没有效果,所以一般传空字符串("")或传 null 就可以了。
让我们在控制台中尝试一下,在执行之前,,然后在控制台输入:
history.pushState('123', '', 'new-url')
执行上面的代码后,它会将页面地址栏中的 URL /new-url,同时将 URL 添加到 history 对象中。此时检查 history.length 会增加 1。
除此之外,我们还可以为每个 URL 存储状态(当前页面的数据)。在上面的例子中,你会把 "123" 存储在 history.state 变量中,当你返回到这个页面时,你就可以 history.state 再次拿到到这些数据。例如:
history.pushState('temp data 1', 'title', 'new-url-1') history.state //"temp data 1" history.pushState('temp data 2', 'title', 'new-url-2') history.state //"temp data 2" history.back() history.state // "temp data 1"
每当通过 pushState 返回到之前被添加到历史记录的页面时,浏览器就会触发一个名为 po凡科抠图tate 的事件,并将 state 数据作为参数。比如在浏览器打开一个新标签页,进入某个网页(),先监听 po凡科抠图tate 事件:
window.addEventListener('po凡科抠图tate', (e) = console.log(e))
然后调用 pushState:
history.pushState({ name: 'test1' }, 'title', 'test1')
然后按下返回按钮,po凡科抠图tate 事件就会被触发,你可以在监听事件中查看打印出来的数据。在打印的数据中,可以找到 history.state 的值。
注册 pushState 中的 url 可以是完整的 url,但必须和当前页面是相同的域名,否则会抛出跨域异常。
浏览器还有一个 replaceState API,和 pushState 的区别是,它只改变了 URL,不会将 URL 添加到历史记录,这里就不再累述了。
实例演示
现在我们做一个小的网页应用,这个应用将实现如下功能:
显示用户列表 可以通过下拉框筛选“先生”和“女士” 当下列列表发生变化时,URL 也会相应的变化我们先不关心 history API,先实现功能。下面是 html 关键代码:
select id="selectbox" option value="both" 全部 /option option value="male" 先生 /option option value="femalt" 女士 /option /select ul id="userslist" li gender="male" 张先生 /li li gender="female" 李女士 /li li gender="female" 王女士 /li /ul
下面是 javascript 关键代码:
let selectBox = document.getElementById('selectBox') let usersList = document.getElementById('usersList') selectBox.addEventListener('change', onSelectBoxChange) function onSelectBoxChange(ev) { let val = this.value filterList(val) function filterList(val) { let users = usersList.children for (let i = 0; i users.length; i++) { let user = users[i] let gender = user.getAttribute('gender') if (gender === val || val === 'both') { user.style.display = '' } else { user.style.display = 'none' }
实现后的效果如下:
当修改下拉列表时,为了使浏览器地址也发生变化,需要使用 pushSate 方法:
function onSelectBoxChange(ev) { let val = this.value filterList(val) history.pushState({ gender: val }, null, val) }
此时会有个问题,当我们点击前进/后退时,浏览器地址变了,但对应的数据却不对。因此,当进行前进/后退时,我们需要监听 po凡科抠图tate 重新过滤数据:
window.addEventListener('po凡科抠图tate', onPopState) function onPopState(ev) { let state = ev.state filterList(state.gender) }
我们还需要处理页面刷新的问题。当刷新页面时,历史记录不会改变,history.state 的状态值也保持不变。所以我们可以从 history.state 中取出当前的状态数据,利用 state.gender 的值就可以在 load 事件中来过虑出当前 URL 对应的用户列表:
window.addEventListener('load', function () { let gender = history.state history.state.gender : 'both' filterList(gender) })
这是个简单的示例,你也可以继续进一步优化。今天的分享就到这里,有问题请在下面留言哦~~
以上就是如何使用 JavaScript 操作浏览器历史记录 API的详细内容,更多关于JavaScript 操作历史记录api的资料请关注凡科其它