AJAX 网页保留浏览器前进后退等功能


Posted in Javascript onFebruary 12, 2011

在一些AJAX被大量使用的页面,有时都不太敢刷新,因为刷新以后可能看到的是和原来有很大不同的页面。暂不讨论在某些页面内容大量更新的情况下是否该使用AJAX的问题,本文简单说一下保留浏览器前进、后退、刷新等功能。
这里假设一个有两个Tabs的页面,每个Tab中含有大量文字,可能还有图片。如果现在觉得Tab2的内容很好,把它加入收藏夹或发送给朋友。下次通过收藏夹打开或者朋友点开这个链接的时候很有可能看到的是Tab1的内容,然后需要鼠标再次点击Tab2才看到想要看的内容。如果页面逻辑更为复杂,则可能要进行多步操作才能回到希望看的内容,这样的体验不太好。
要使刷新、加入收藏夹等功能正常使用,需要让当前的操作在URI上有所体现。但是改变URI的同时又不能引起页面的刷新,因此可以通过改变URI中的片段(fragment)来实现。例如,点击Tab1后将URI改为http://www.example.com/example.html#tab1,点击Tab2则将URI改为http://www.example.com/example.html#tab2。

function ShowTab1() { 
$("#tab2").hide(); 
$("#tab1").show(); 
window.location.hash = "#tab1"; 
}; 
function ShowTab2() { 
$("#tab1").hide(); 
$("#tab2").show(); 
window.location.hash = "#tab2"; 
};

这样做已经使得URI产生了变化,但是无论通过http://www.example.com/example.html#tab1还是http://www.example.com/example.html#tab2访问页面都是显示Tab1的内容,所以还需要在页面载入时读取#后的内容。
$(document).ready(ShowTab()); 
function ShowTab() { 
if (window.location.hash == "#tab2") 
ShowTab2(); 
else 
ShowTab1(); 
}

这样,刷新和加入收藏夹等功能都已经可以使用了,不过前进和后退还是会有麻烦。虽然这两个按钮已经变得可用,但是点击时网页的内容并没有发生变化。我们需要用到body的onhashchange事件。onhashchange事件并不是所有浏览器都支持的,如果要使不支持该事件的浏览器也检测#后内容的变化,可能需要写一个函数定期检测window.location.hash的变化或者自己实现onhashchange事件。
示例代码打包下载 (Visual Studio 2010)
Javascript 相关文章推荐
基于jQuery的动态表格插件
Mar 28 Javascript
遍历DOM对象内的元素属性示例代码
Feb 08 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
Jul 18 Javascript
javascript实现获取图片大小及图片等比缩放的方法
Nov 24 Javascript
浅析Ajax语法
Dec 05 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
Aug 19 Javascript
七行JSON代码把你的网站变成移动应用过程详解
Jul 09 Javascript
vue路由 遍历生成复数router-link的例子
Oct 30 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 Javascript
一些主流JS框架中DOMReady事件的实现小结
Feb 12 #Javascript
javascript中删除指定数组中指定的元素的代码
Feb 12 #Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 #Javascript
编写可维护面向对象的JavaScript代码[翻译]
Feb 12 #Javascript
URL地址中的#符号使用说明
Feb 12 #Javascript
基于Jquery制作的幻灯片图集效果打包下载
Feb 12 #Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 #Javascript
You might like
php利用header函数下载各种文件
2016/08/24 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
python查看模块,对象的函数方法
2018/10/16 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
致跳高运动员加油稿
2014/02/12 职场文书
六一儿童节主持词
2014/03/21 职场文书
关于安全演讲稿
2014/05/09 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
辩护词范文大全
2015/05/21 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
Java基础-封装和继承
2021/07/02 Java/Android
php将xml转化对象的实例详解
2021/11/17 PHP