最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 剖析浏览器历史记录

    正文概述 掘金(BenjaminShih)   2021-01-21   657

    如何生成一条历史记录

    1. 简单粗暴的方法,直接在当前页面的地址栏中输入地址
    2. 点击页面中有a标签的href
    3. 执行location.href = 'xxx'(location.replace('xxx')生成一条记录取代当前指针所指向的记录)
    4. 表单提交跳转(注意只能跳到当前窗口)
    5. 使用pushState方法可以不刷新页面就可以生成一条历史记录,页面URL发生改变

    简而言之,只要当页面的URL改变时,就会生成一条历史记录。在IE8及更高的版本中、Opera、Firefox、Chrome、Safari3及更高的版本中改变hash也会生成一条历史记录。

    浏览器对历史记录的管理

    历史记录在浏览器中以栈的形式进行管理,每次增添的历史记录都会在栈的最顶端,以谷歌浏览器为例 html代码:

     <div>
         <a href="demo1.html">demo1</a>
     </div>
     <div>
     <!--通过location.href="demo2.html"改变页面地址:-->
     <button type="button" onclick="changTo(2);">href="demo2.html"</button>     
     </div>
     <div>
         <form action="demo3.html" method="get" class="dib"><button type="submit" >demo3.html</button></form>
     </div>
     <div>
     <!--通过pushState来改变页面地址:-->
       <button type="button" onclick="push4()">pushState"demo4.html"</button>   
    </div>
    

    js代码:

    function changTo(index) {
     location.href = 'demo' + index + '.html';
    }
    function  push4() {
     history.pushState('hello', '', '/demo4.html')
    }
    

    点击demo1,demo2,demo3,demo4,然后再点击demo3,demo2,demo1生成的历史记录如下图: 剖析浏览器历史记录

    使用history API操作栈指针来获取历史页面

    指针所在的位置会获取当前页面的state, history.back() : 返回上一页 history.forword() : 跳转到前一页 history.go(n) : n可以为正数也可为负数,代表当前指针是向前移动还是向后移动几个位置。如果n大于或小于历史记录的数目时,指针不会发生任何变化。

    下面图片的操作步骤为:先back() => go(-2) => go(-2) => go(2) 剖析浏览器历史记录

    如果此时在demo3的位置点击demo1,历史记录栈会如下所示: 历史记录都是插入在栈指针所在位置的后面,前面的记录会被自动删除 剖析浏览器历史记录

    限制

    历史记录超过了浏览器限制的最大条数(比如chrome、firfox为50条,IE超过了100),栈顶进入一条历史记录,则栈的底端移出去一条。

    ##单页面应用中如何实现路由切换

    ###HTML5推出的history API

    三种方法:pushState replaceState onPopState

    pushState(state, title, URL)

    1. state: 代表一个Javascript对象,在创建对象的时候设置,可以在onpopstate和history对象中获取。(we impose a size limit of 640k characters on the serialized representation of a state object.)
    2. title: Firefox目前忽略这个参数,你可以给你的state设置一个小标题
    3. URL: 压人记录栈中URL,可选,不指定则视为当前URL。
    • 当执行pushState这个方法的时候不会去加载这个URL,但是会改变地址栏中的url。当重新加载这个页面时,URL是push进去的参数。
    • URL必须是同源链接

    replaceState(state, title, URL)参数和pushState一样,会替代当前指针指向的历史记录

    onPopState: 当指针在历史记录栈中已有的位置上移动时会触发,且指定的地址仍然在当前dom中。pushState和replaceState的操作不会触发这个事件 MDN解释:

    1. 方法一

    生成一条历史记录

    window.history.pushState('{key: 1586}', '', '/demo1.html')
    

    切换页面

    window.addEventListener('popstate', e => {
      const obj = e.state // 可获取栈指针指向的记录state
      // dosometing
     })
    

    异步传参

    可根据state来传参

    根据hash实现,hashchange来捕捉路由的变化

    2.方法二

    生成一条历史记录

    function getHash() {
      // We can't use window.location.hash here because it's not
      // consistent across browsers - Firefox will pre-decode it!
      const href = window.location.href
      const index = href.indexOf('#')
      return index === -1 ? '' : href.slice(index + 1)
    }
    function pushHash (path) {
      window.location.hash = path
    }
    function replaceHash (path) {
      const i = window.location.href.indexOf('#')
      window.location.replace(
        window.location.href.slice(0, i >= 0 ? i : 0) + '#' + path
      )
    }
    

    切换页面

    hashchange监听后退和前进操作

    window.addEventListener('hashchange',function(){
      // dosometing
    })
    

    异步传参

    function getParams(){
      var hashArr = location.hash.split("?"),
        hashName = hashArr[0].split("#")[1],//路由地址
        params = hashArr[1] ? hashArr[1].split("&") : [],//参数内容
        query = {};
      for(var i = 0;i<params.length ; i++){
        var item = params[i].split("=");
        query[item[0]] = item[1]
      }       
      return {
        path:hashName,
        query:query
      }
    }
    
    

    下载网 » 剖析浏览器历史记录

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元