一、问题

随着AJax技术的普及,单页面web程序的应用越来越广泛。

所谓单页面应用程序,简单的说,就是应用只有一个主网页,第一次加载后,后续页面只会利用js和ajax到服务器获取数据进行页面的局部刷新。

因为实际一直只有一个页面,虽然看上去页面经常发生变化(比如点了一个链接或按钮),但无法利用浏览器工具栏上的倒退、前进按钮进行操作。

这个会导致一些不便。

而html的a标签的 href属性可以设置 #锚点,来支持浏览器的倒退、前进。 下面我们就利用这属性来进行处理。

二、解决

我们来通过例子说明:

假设应用的主网页为 xxxurl , 页面的顶部有两个链接(相当于导航)

<a>主页</a>

<a>设置</a>

<div id="home">主页的内容</a>

<div id="set">设置的内容</a>

页面初始启动时,会显示主页对应的内容,id为home的div区域会显示,id为 set的区域会隐藏。

当点击“设置”链接时,希望id为home的div区域会隐藏,id为 set的区域会显示,同时也会触发ajax事件来从服务器获取数据更新id为 set的区域的内容。

同样当点击“主页”链接时,希望id为home的div区域会显示,id为 set的区域会隐藏。

下面我们看看怎么实现:

我们来给链接增加锚点,代码如:

<a href="#">主页</a>

<a href="#set">设置</a>

我们编写js代码,首先要在页面的启动事件中增加如下代码,这是关键:

window.onhashchange=hashChange;   //当网页的锚点发生变化时,会触发onhashchange事件,从而调用hashChange方法

编写hashChange方法,在该方法中利用js操作,进行页面的更新和数据的刷新。

function hashChange(){
if(!location.hash || location.hash=="#"){
//通过css的控制,让id为home的div区域会显示,id为 set的区域会隐藏    // 也可在这里利用ajax到服务器获取数据,更新页面
}
else if(location.hash=="#set"){
//通过css的控制,让id为set的div区域会显示,id为 home的区域会隐藏    // 也可在这里利用ajax到服务器获取数据,更新页面
}
}

另外因为页面启动时,不会触发onhashchange事件,也需要自己在页面启动事件中主动调用下hashChange方法。

后续当点击链接时,或者操作浏览器上的前进、后退按钮时,会触发onhashchange事件。

这样,我们通过这种方式就解决了文章开头提到的问题。

三、补充说明

需要补充下的时,html5增加了一个新的特性,引入了histtory.pushState()和history.replaceState()这两个方法,通过他们也可以实现类似的功能,这个有兴趣的可自行研究。

如果是简单的应用,利用标签a的锚点特性就可以达到相应的目的,并且简单易懂。复杂的应用,可以考虑利用html5的新特性。

最新文章

  1. 解决Unable to locate Kerberos realm
  2. jsp 页面 性别回显
  3. 解决Linux下zip文件解压乱码问题
  4. 细说SQL性能优化
  5. 最简化模型2——css3分阶段动画效果(经过实测)之转动的div
  6. 论decltype和auto的区别
  7. Windows下SQLMAP的安装图解
  8. 再一波Python实战项目列表
  9. JSLint报错翻译
  10. mysql 备份 恢复
  11. 一个关于cookie的坑
  12. c++ primer 笔记 (四)
  13. CentOS7.3环境下源码安装httpd
  14. global 全局变量 nonlocal 局部变量
  15. C++学习一Virtual
  16. mab算法
  17. (转)面向对象(深入)|python描述器详解
  18. Kernel 4.9的BBR拥塞控制算法与锐速
  19. Cognos11中报XQE-JDB-0004查找驱动程序类错误
  20. ASP.NET Core 2 学习笔记(十二)REST-Like API

热门文章

  1. 手机SIM卡介绍 三类不同标准的SIM卡
  2. AssetManager中的路径参数不能包含&quot;assets/&quot;
  3. android中文字高亮设置案例
  4. ddraw 视频下画图 不闪烁的方法
  5. HDU 3584 Cube
  6. 字符串模式匹配KMP算法
  7. HDU 1104 Remainder( BFS(广度优先搜索))
  8. 详解iOS开发之自定义View
  9. (译)Node.js的全局变量
  10. CSS的float与clear