hash & history

mode: history/hash(默认),本质上还是利用浏览器自身的特性,改变url但是不请求接口,监听浏览器的两个原生事件,实现前端路由,如:

  • popState事件
  • hashChange事件

history

记录了浏览器当前窗口的浏览历史

  • pushState({}, '', ''):修改search部分,三个参数:
    • state对象,popState事件触发时回调函数中的event.state可接收,可为null
    • 新页面标题,目前浏览器忽略,可为null
    • 新页面地址
  • replaceState({}, '', ''):替换当前历史记录

pushState、replaceState并不会立马触发popState事件,只是url变化
go、back、forward或者手动点击浏览器前进和后退按钮才会触发popState

  • go()
  • back()
  • forward()

  • state:history.state可查看到当前页面的state对象

  • length:history.length浏览器历史记录的个数

window.addEventListener('popstate', function(event) {
    console.log('location: ' + document.location)
    console.log('state: ' + JSON.stringify(event.state))
})

hash

改变的是#后面hash部分

  • 监听hashchange事件,可以拿到新旧两个url
window.addEventListener('hashchange', function (e) {
  console.log(e.newURL, e.oldURL)
  var str = e.newURL.split('#')[1]
})

比较:

  • hash丑,只能传短字符串,history可以传递state对象
  • history模式,需要后端配合(配置index.html),解决(页面回退刷新)找不到路径404的问题
  • hash只能是同一文档,history可以是同源的任意文档URL
  • hash浏览器都支持,history是HTML5的新特性

results matching ""

    No results matching ""