History带给单页应用的噩梦

前言

在我们日常的网页浏览中,我们非常喜欢做一个操作:点击浏览器的前进后退

在Ajax技术出现后,有些时候前进后退就会给开发者带来困扰,甚至一些开发者试图去干掉History

随着Html5的发展,移动端的兴旺,单页应用出现了,于是History的处理被不得不提上议程了!

要知道,这一直是一项让人不愿意去碰的巨坑,但是单页应用却不得不去解决

首先History的处理逻辑看似简单,实则负责,稍不注意就会出问题,我们这里来探讨下单页中History的处理规则

基础知识

javascript中History的历史对象包含用户已经浏览的URL信息,这就是我们传说中的历史记录

我们一般会用到forward/back两个方法与一个length接口,或者使用go具体到哪一层

后面一点,浏览器厂商发现History对象确实被管的过紧,于是又释放了两个关键接口,pushState以及replaceState,用于操作History对象

于是我们今天的一个重点便是这里的pushState以及replaceState,这两位同学可以向History中压入对象,并且在浏览器前进后退时会被触发

pushState

pushState会往History中写入一个对象,他造成的结果便是

① History length +1

② url 改变

③ 该索引History对应有一个State对象

这个时候若是点击浏览器的后退,便会触发popstate事件,将刚刚的存入数据对象读出,这里举一个简单例子

<html xmlns="http://www.w3.org/1999/xhtml"><head>
  <title></title>
  <style type="text/css">
    div { margin: 10px; }
    .msgBtn { margin: 10px; padding: 10px; border: 1px solid black; }
  </style>
    <script id="others_zepto_10rc1" type="text/javascript" class="library" src="/js/sandbox/other/zepto.min.js"></script>
</head>
<body>
  <div id="msg">
    消息框</div>
    <br><br>
  <span class="msgBtn">去第一页</span> <span class="msgBtn">去第二页</span> <span class="msgBtn">去第三页</span>
  <script src="../../jquery-1.7.1.js" type="text/javascript"></script>
  <script type="text/javascript">
    var _loc = location.href;

    function showMsg(el, msg) {
      el.html(msg);
    }

    window.addEventListener('popstate', function (e) {
      if (!e.state) return;
      showMsg($('#msg'), e.state);
    });

    $('.msgBtn').click(function (e) {
      var msg = $(e.target).html();
      showMsg($('#msg'), msg);
      history.pushState(msg, msg, _loc + '/' + msg);
    });

  </script>

        <style></style>
                <script></script>

<!-- Generated by RunJS (Wed May 07 18:05:27 CST 2014) 1ms --></body></html>

http://sandbox.runjs.cn/show/cspv3812

我们点击第一页时,往History中压入了数据,并且往里面写入了State对象(当前为msg),然后我们在浏览器后退时便会触发popstate事件

这个时候我们的URL已经发生改变,我们在事件点触发时便能进行操作了,我们这里的操作是改变msg的信息

所以这里我们得到的结果是

① pushState 会改变History

② 每次使用时候会为该索引的State加入我们自定义数据

③ 每次History的变化(forward、back、go)皆会导致popstate的触发,并且将对应索引的State搞出来

④ 每次我们会根据State的信息还原当前的view,于是用户点击后退便有了与浏览器后退前进一致的感受

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 浏览器
, msg
, 一个
, pushstate
, 单页应用
, history
history对象
纯黑的噩梦、铃铛噩梦、柯南纯黑的噩梦完整版、阴阳师铃铛噩梦、名侦探柯南纯黑的噩梦,以便于您获取更多的相关知识。

时间: 2025-01-26 14:07:22

History带给单页应用的噩梦的相关文章

React+Redux打造“NEWS EARLY”单页应用 一步步让你理解最前沿技术栈的真谛

之前写过一篇文章,分享了我利用闲暇时间,使用React+Redux技术栈重构的百度某产品个人中心页面.您可以参考这里,或者参考Github代码仓库地址. 这个工程实例中,我采用了厂内的工程构建工具-FIS,并贯穿了react+redux基本思想. 今天这篇文章给大家分享一个更加复杂,但是非常有趣的一个项目- News Early单页应用. 我把这个项目所有代码托管在了我个人Github之中,感兴趣的读者可以跟我探讨. 最近我发现,React Redux生态圈项目活跃.但是作品质量"良莠不齐&qu

html5手机Web单页应用实践--起点移动阅读

一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读.而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发现越改越多越改越多- 注意此web应用只支持android及iphone内的浏览器,及PC或mac上的chrome,safari,firefox等支持html5的浏览器.IE10以上浏览器 这算是试验版了吧,以前没这么弄过.. 手机访问http://crapi.4gshu.com:8096/4g-r

浅析单页网站如何优化

众所周知,一个拥有良好排名的网站,不外乎内容和外链,俗话说:"内容为王.外链为皇",这是不变的搜索原理,一个网站如果没有良好的内容更新和外链权重的导出,那么你想取得良好的单页排名,除了运用黑帽手段以外,我想应该不会是件容易事,除非你的域名是老域名了,这个域名权重的积累,也会使你的网站排名很好的.那么针对单页面优化方面,我总结了以下五个方面,希望可以帮到做单页面网站的朋友,大家互相学习一下,也多请老鸟拍拍转. 一.网站分析: 首先要在单页面控制好关键词的密度,密度大约值在6%左右,其次,

深度剖析百度百科单页高排名的内因

百度百科在seoer心中一直是个神话,单页高排名.如何能使自己的网站做到向百科这样的优,走进百科代码,深度剖析百度百科单页高排名的内因. 一.Title Description Keywords如何写   从这个图片中可以看出,百度百科提倡精简不臃肿的title书写方式,而不是现在大家追求的关键词堆叠,其次大家可能也发现了,description和keywords都已经不存在了,只有标题,显示在搜索引擎中的描述都是自动提取网页的前一部分.也就是说你可以完全忽略你的后两项. 二.LOGO如何用  

使用AngularJS创建单页应用的编程指引

  这篇文章主要介绍了使用AngularJS创建单页应用的编程指引,AngularJS是一款高人气的JavaScript库,需要的朋友可以参考下 概述 单页应用现在越来越受欢迎.模拟单页应用程序行为的网站都能提供手机/平板电脑应用程序的感觉.Angular可以帮助我们轻松创建此类应用 简单应用 我们打算创建一个简单的应用,涉及主页,关于和联系我们页面.虽然Angular是为创建比这更复杂的应用而生的,但是本教程展示了许多我们在大型项目中需要的概念. 目标 单页应用 无刷新式页面变化 每个页面包含

了解Backbone如何用于创建Ajax应用程序或单页界面

Backbone 是一个 http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 框架,可用于创建模型-视图-控制器 (model-view-controller, MVC) 类应用程序和单页界面.在本文中,我们将了解 Backbone 如何用于创建 Ajax 应用程序或单页界面. Web 应用程序越来越关注于前端,使用客户端脚本与 Ajax 进行交互.由于 JavaScript 应用程序越来越复杂,如果没有合适的工具和

使用 React-Router 创建单页应用

最近业余时间在学习 React,配合 Redux 和 React-Router 正在不紧不慢地开发一个小工具moviemaster,用于管理硬盘中的电影剧集.在单页应用开发中,redux 并不是必须的,所以今天只讲讲 前端的路由系统以及 React-Router的简单使用. 什么是路由 以下来自维基百科:: 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动.路由发生在OSI网络参考模型中的第三层即网路层.路由引导分组转送,经过一些中间的节点后,到它们最后的目的地. 这是

jQuery Scroll插件响应式单页全屏滚动介绍

One Page Scroll是一个响应式单页全屏滚动的jQuery插件,效果有点类是于fullpage.js,不过这个插件却是另外一个,它可以轻松的建立一个动感的响应式的滚动效果页面,比较适用于单页面的专题站,如:Apple's iPhone 5S 这样的网站,能大大的提升用户的体验,也提升自身的品牌形象.当然One Page Scroll是基于jquery的,且需要1.9.0以上版本,支持现代浏览器和IE8以上版本. One Page Scroll响应式单页全屏滚动jQuery插件 插件要求

从单页分析用户的行为和该如何建淘客站

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 淘宝客是近一年最热的网赚项目,同时也带热了一种网站模式,相信大家都知道了,对,就是单页网站.事物总有两面性,有好处必然也有坏处. 一.好处; 好处被炒得很热,主要包括:1.简单,能批量生产.淘宝客单页程序非常简单,没有任何技术含量只要会上传就可以,还可以批量复制,站群操作成为可能;2.转换率高.单页网站的转换率一直受大家追捧,至于实际是怎么样