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 相关文章推荐
多浏览器兼容的获取元素和鼠标的位置的js代码
Dec 15 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
js document.write()使用介绍
Feb 21 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
Jan 20 Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 Javascript
Angular6 Filter实现页面搜索的示例代码
Dec 02 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
Oct 15 Javascript
环形加载进度条封装(Vue插件版和原生js版)
Dec 04 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP源码之explode使用说明
2011/08/05 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Python递归函数特点及原理解析
2020/03/04 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
生日派对邀请函
2014/01/13 职场文书
先进工作者获奖感言
2014/02/08 职场文书
合作投资意向书
2014/04/01 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python