1.问题背景
假设页面A,以表单的形式提交数据给页面B。也就是说B页是根据A页提交上来的值生成的。然后又从B页面t访问C页面。这时如果从C页面点浏览器的“返回”按钮,会提示B页的网页已过期。
一个简单的示例:比如A页面里面有文本框/下拉框等。还有一个提交按钮,提交的数据会在A页面嵌入的iframe(B页面)显示。B里面有连接去访问C页面。
2.原因
提交后表单上的数据不会被浏览器的缓存保存;
当点击返回按钮时,已经没有A中表单提交的数据。
3.处理方法
1.在C中添加一个返回按钮,通过它能成功返回到B页面;
2.JS清除网页历史记录,屏蔽后退按钮。
先来实现第一个。
从原因我们知道,返回后显示“网页已过期”的最关键的原因是从A提交的数据没有被浏览器缓存保存。所以在B页面可以尝试保存从A提交过来的数据。然后在C页面能够取到,并且将这些数据提交能B页面的链接地址。因为B页面是A页面嵌入的iframe。所以再将这个链接地址赋给这个iframe的src就可以实现从C页返回到B页。
现在假设从A通过表单提交过来三个参数start、end、num。
首先在B页获取这三个参数:
<%
String start = request.getParameter("start");
String end = request.getParameter("end");
String num = request.getParameter("num");
%>
要在C页面还能获取到,可以将它们保存到cookie上:
<script type="text/javascript">
addCookie("path",location.href,0);//将当前页面链接保存为path加入cookie。
addCookie("start",'<%=start%>',0);
addCookie("end",'<%=end%>',0);
addCookie("num",'<%=num%>',0);
function addCookie(name,value,expiresHours){
var cookieString=name+"="+value;
//判断是否设置过期时间
if(expiresHours>0){
var date=new Date();
date.setTime(date.getTime+expiresHours*3600*1000);
cookieString=cookieString+"; expires="+date.toGMTString();
}
document.cookie=cookieString;
}
</script>
然后,在C页面通过javascript操作cookie获取到这些参数(以及B页面的链接地址);
var startTime=getCookie("start");
var endTime=getCookie("end");
var num=getCookie("num");
var path=getCookie("path");
//读取cookies
function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return (arr[2]);
else
return null;
}
在C页面添加按钮,点击按钮执行javascript中定义的函数将获取的链接赋值给父页面(A页面)中的iframe的src。假设iframe的id为report:
</pre><pre name="code" class="html"> <input type=button value="返回" id="back" οnclick="back()">
<pre name="code" class="html">function back(){
window.parent.$("#bodyReport").attr("src",""+path+"?"+"start="+start+"&"+"end="+end+"&"+"num="+num);
}
通过上面这些步骤,在C页面中点击“返回”按钮就可以成功返回到B页面了。
但是这个时候点击浏览器的回退按钮,返回还是会在B页面显示“网页已过期”,考虑到的一种方式是将浏览器的回退按钮屏蔽。
在网上看到了一些屏蔽的方法,感兴趣的人可以参考:
http://bbs.9ria.com/thread-240607-1-1.html
自己尝试了里面的方法,可能是自己没领悟透或者操作有误,并没有实现屏蔽功能。
最后找到了一篇:
http://every-best.iteye.com/blog/841423
模仿里面的方法成功的实现了屏蔽了IE浏览器的返回按钮(只在IE浏览器上可行)
具体实现如下:添加两个文件:e.html和f.html。
e.html:
<html>
<head>
<!--页面本身没有多大用处,不显示。 -->
<!--只是为了屏蔽IE浏览器的回退按钮而增加的中间步骤页面-->
<title></title>
</head>
<body>
this is e page;
</body>
<script type="text/javascript">
window.location.href="f.html";
</script>
</html>
f.html:
this is f page;....
<!--页面本身没有多大用处,不显示。 -->
<!--只是为了屏蔽IE浏览器的回退按钮而增加的中间步骤页面-->
在C页面添加一个iframe:
<iframe id="abc" src="e.html" width="200" height="300" style="display:none"/>
<span style="font-size:18px;">这时候在C页面再去点击浏览器的返回按钮就不会尝试返回B页面,也就不会报网页已过期的错误。具体的实现原理去参考上面引用的那篇文章吧。</span>
备注:
感觉这种方法还是很粗糙,最希望还是能够实现点击浏览器的返回按钮能成功的返回B页面。希望有高手能提供!