easyui修复浏览器刷新后,tab页全部关闭的问题
一.问题描述
使用easyui搭建的上左右页面布局,当我们在右侧打开了tab页,发现点击浏览器的刷新按钮后,整个页面会被重新渲染,导致所有打开的tab页都被关闭,回到初始状态的问题。
这个问题虽然不影响业务,但对用户操作造成了一定的困扰。因为浏览器刷新后,tab页全部被关闭,那么用户又需要打开刚才正在使用的tab页,甚至有可能,用户会忘记打开过哪些tab页。
二.解决思路
因为浏览器刷新后,页面重新渲染,所有tab页都不存在了,其实并不是关闭了tab,只是页面回到了初始状态。所以要解决这个问题,我们可以使用一个变量来保存已经打开的tab页的信息,这样即使页面刷新,我们也可以通过这个变量来恢复到原来的状态。
三.解决步骤
1.使用cookie来保存这个变量
//从cookie中读取treeNodes的值,其中保存着处于打开状态的tab页的信息
treeNodes = $.cookie("treeNodes");
if(treeNodes == null){
//如果为空,则表示没有打开的tab页
treeNodes = [];
}else{
//如果不为空,则表示加载这个页面之前,存在已经打开的tab页
//注意:cookie中存放的是string类型,需要转化为json数组对象
treeNodes = $.parseJSON(treeNodes);
}
2.为菜单树添加onLoadSuccess事件,用来恢复原来已经打开的tab页的状态;菜单树的onClick事件中,每次打开一个tab,增加一个对应的值
/*
* 获取左侧菜单树,并为其节点指定单击事件
*/
$("#home-west-tree").tree({
url: "${ctx }/tree.do",
method: "get",
animate: true,
//当tree加载成功后,检查是否之前存在已经打开的tab页
//如果存在,则打开对应的tab页
onLoadSuccess: function(){
for(var i = 0; i<treeNodes.length; i++){
var treeNode = treeNodes[i];
//通过节点的id来找到node
var node = $("#home-west-tree").tree("find",treeNode.id);
addTab({
url: "${ctx }/" + node.attributes.url,
title: node.text
});
}
},
onClick: function(node){
if(node.attributes && node.attributes.url){
addTab({
url: "${ctx }/" + node.attributes.url,
title: node.text
});
//当用户点击tree打开tab页时记录到treeNodes中
//因为tree和tabs相关的属性就只有text和title,所以必须保存这一个属性,
//后来发现tree只有一个find方法(通过id查找node)能方便的找到对应的node,所以只好将id也保存下来
treeNodes.push({
"id":node.id,
"text":node.text
});
//每次对treeNodes的操作都要保存到cookie中
//注意:treeNodes需要转化为string才能保存到cookie中
$.cookie("treeNodes",JSON.stringify(treeNodes));
}
}
});
3.为tabs组件添加onClose事件,每次关闭一个tab,删除一个对应的值
/*
* 初始化内容区的tabs
*/
$("#home-tabs").tabs({
fit : true,
border : false,
//为其附加鼠标右键事件
onContextMenu: function(e, title, index){
e.preventDefault();
var mm = $("#home-tabs-menu");
//显示右键菜单
mm.menu("show",{
top: e.pageY,
left: e.pageX
}).data("tabTitle",title);
//为右键菜单选项绑定事件
mm.menu({
onClick: function(item){
closeTab(this, item.name);
}
});
},
//每次关闭tab页时,删除treeNodes中对应的值
onClose: function(title, index){
for(var i=0; ; i++){
if(treeNodes[i].text == title){
treeNodes.splice(i,1);
$.cookie("treeNodes",JSON.stringify(treeNodes));
break;
}
}
}
});
四.总结与说明
在修复过程中,引用了jquery.cookie.js来操作cookie。
这个变量应该和页面无关,只和会话有关,所以可以有两种方式来处理,一种是发送到后台,保存到session中,另一种是保存到cookie中,我这里使用的是后面一种方法。
其中最容易出问题的就是json对象和string的转换,我们在程序中,treeNodes是json数组对象,而cookie保存的只能是string对象,所以这两者之间的转换一定要注意,而我就在这里折腾了好久好久。。。
五.后记
#2016-03-14
在使用过程中,发现了一个bug。在多选项卡类型的浏览器中,如果只关闭选项卡而不完全关闭浏览器,则会造成再次打开网页后,tab页会恢复到原来的状态,即关闭选项卡再打开,相当于刷新页面。
我也尝试过js监听网页关闭和刷新,可是最终发现,只能区分只有一个选项卡的浏览器关闭和刷新事件,对于多选项卡则无能为力。
easyui修复浏览器刷新后,tab页全部关闭的问题的更多相关文章
- H+ 编辑tab页 保存后 刷新列表tab页 并关闭自已。tabA页调用tabB页的方法
//注:在contabs.js文件中 $(function () { }); 方法外 加入 //注: data-name="' + menuName + '" 这句是加入的自定义属 ...
- easyui刷新指定tab页里面的数据
主页Home/Index中使用tab管理,在主页中设置一个刷新的方法. /** * 刷新指定的tab里面的数据 * @param title 选项卡标题 * @param refreshTabFunc ...
- php-fpm正在生成页面时,浏览器刷新后,php-fpm会退出吗?
好久没写博客了,因为没有啥可写. 之所以有此疑问,是因为看了一篇大牛的文章:PHP升级导致系统负载过高问题分析.看完后,其中有些文字触发了我这个想法,也想验证一下. 方案,用tcpdump抓包,用st ...
- easyUI tabs 显示与隐藏 tab 页
隐藏: tab_option = $('#tabs').tabs('getTab'," 单位信息 ").panel('options').tab; tab_option.hide( ...
- chrome浏览器tab页内存占用变大,网站变慢为哪般?
问题概述: 公司做的是BS应用. 之前我们的后台服务器程序是带状态的,用ehcache存储登录状态:这两天被我改成了redis存储,应用本身不再存储登录状态. 然后自测,我在测试某个很耗时间的网页操作 ...
- 使用easyui为tab页增加右键菜单
在使用easyui进行上左右布局一文中,我们已经使用easyui搭建起了一个简单的上左右布局.在使用的过程中,我们经常会遇到tab页打开的太多,但只能一个一个的关闭的烦恼,这个时候有没有想到eclip ...
- easyui中tab页中js脚本无法加载的问题及解决方法
我发现tab页中<script src="xxx.js">方式加载的脚本没有生效,firebug看请求也没有请求相应的脚本文件. 单独在浏览器中打开tab页中的页面js ...
- SPA项目开发之tab页实现
实现思路及细节 1.利用前面博客所讲的Vuex的知识:定义几个变量 Options:存放tab页对象的容器(主要是路由路径以及tab页的名字) activeIndex:被激活的tab页路由路径 sho ...
- 跨浏览器tab页的通信解决方案尝试
目标 当前页面需要与当前浏览器已打开的的某个tab页通信,完成某些交互.其中,与当前页面待通信的tab页可以是与当前页面同域(相同的协议.域名和端口),也可以是跨域的. 要实现这个特殊的功能,单单使用 ...
随机推荐
- 攻防世界逆向——game
攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...
- jmeter永久调为中文
将jmeter调为中文有两种方法,一是在软件设置中切换,二是修改配置文件. 第一种方式是临时的,下次重新打开会变回为英文 第二种方式是永久的,每次打开都会显示自己配置好的语言 第一种方式: 第二种方式 ...
- Android开发如何准备技术面试(含Android面试押题)
今年毋庸置疑是找工作的寒冬,每一个出来找工作的同学都是值得尊敬的.现在找工作,虽然略难,但是反过来看也会逼迫我们成为更加优秀的自己. 但是不管是旺季还是寒冬,有一些优秀的同学找工作还是挺顺利的.所以说 ...
- 四、C#简单操作MinIO
MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO He ...
- Linux守护进程及Systemd
当我们启动一个前台任务后,命令行窗口退出,应用也就一起退出,无法访问了.怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢? 守护进程 前台任务和后台任务 ...
- 遇到的JDBC的一些简单错误
遇到的JDBC的一些简单错误 复习java swing的使用的时候,把东西都写好了,但是在进行数据库连接的时候,出现了错误 java.lang.ClassNotFoundException: com. ...
- IDM-下载工具
下载所需要的工具 1.IDM下载地址 链接:https://pan.baidu.com/s/1bHXA0pUYBOAC5f_2Iqvl_g 提取码:lsha 2.IDM破解包下载地址 链接:https ...
- Git (10)-- 打标签(git tag)
@ 目录 1.列出标签 2.创建标签 2.1.附注标签 2.2.轻量标签 3.后期打标签 4.共享标签 5.删除标签 6.检出标签 超详细 Git 图文版小白教程(持续更新) 像其他版本控制系统(VC ...
- CentOS6与CentOS7的几点区别
重新安装了一个CentOS7,顺便整理一下与自己之前用的CentOS6的区别 CentOS6以下简称c6 CentOS7以下简称c7 1.关于文件系统: c6 6.x使用EXT4,EXT4单个文件系 ...
- Slope Trick:解决一类凸代价函数DP优化
[前言] 在补Codeforce的DP时遇到一个比较新颖的题,然后在知乎上刚好 hycc 桑也写了这道题的相关题解,这里是作为学习并引用博客的部分内容 这道题追根溯源发现2016年这个算法已经在API ...