您现在的位置: 365建站网 > 365学习 > js/javascript使用history.go(-1)返回上一页出现网页过期的解决方法

js/javascript使用history.go(-1)返回上一页出现网页过期的解决方法

文章来源:365jz.com     点击数:316    更新时间:2017-12-27 11:21   参与评论
项目需求:先进入内容列表页面,页面显示数据,每一条数据对应一个标题,点击标题(超链接)进入内容页,点击返回(超链接)可以回到内容列表页面
本来想使用history.go(-1)简单地返回上一页,但却出现了一个奇怪的现象

1进入内容列表页,点击内容页后返回成功
2在内容列表页点击【搜索】,获得新数据后点击标题进入内容页,点击【返回】,出现网页已过期错误页面
3点击【搜索】,再点击【下一页】,然后再点击标题进入内容页,点击【返回】,返回成功。

找了很久,终于发现,原来问题出在提交方式(Get/Post)上,如果使用Post提交,history.go(-1)返回会出现网页已过期的错误
而超链接默认是get方法,<s:form>默认为Post方式
而我第一次【搜索】的时候使用到了<s:form>表单提交,提交方式为POST,相对于内容页,返回的页面的提交方式是Post,因此出现问题【2】
如果我【搜索】后再点击【下一页】,由于我的上下页是用超链接实现的,因此相对于内容页,返回的页面的提交方式变回get,因此返回成功。

解决方案:
1将提交方式改为超链接的形式:xxxx.action?page=XX&parame=XX......
2修改form的提交方式

<s:form method="get" action="XXX.action?"  > 

3如果只是考虑一个页面(action)的情况,可以修改返回的方式,不用history.go(-1),使用url

<a href="xxxx.action?page=XX¶me=XX...">返回上一页</a

4通过js获取上一个页面的url路径,然后判断该返回哪一个Action及是否使用history.go(-1)

function goToHistory(){ 
    var str=document.referrer;//上一个点击进来的页面 
    if(str!=null){ 
        str = str.split("?")[0].split("/"); 
        var actionName = str[(str.length-1)];//获取action名字 
        if(actionName=="MyText.action"){ 
            location = "MyText.action";//返回MyText 
        }else if(actionName=="YouText.action"){ 
            var url = "YouText.action"//返回YouText 
            location = url; 
        }else{ 
            history.go(-1); 
        } 
    }else{ 
        alert("这个页面是初始页面"); 
    } 

document.referrer可以获取上个页面的整个url(含参数),详细获取参数可以参考http://blog.csdn.net/kaidishi/article/details/9732913
当然你也可以将参数传递进方法里,以goToHistory(parame1,parame2)的方式进行修改【如果提交数据并非保密的情况,建议使用第2种方式】

另外的一种解释:JavaScript:history.go(-1)返回上一页时,网页已过期

解决办法:首先试试back()或go(-2),若依然不行,则取消禁用页面缓存的限制
session_cache_limiter('private,must-revalidate');
作用:当session_cache_limiter('private')时,用处是让表单history.go(-1)的时候,填写内容不丢失。
go(-2)后再forward(1).
为什么我在点击浏览器的后退按钮后,所有字段的信息都被清空了



答:这是由于你在你的表单提交页面中使用了 session_start 函数。
因为我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存。所以出现了’警告: 网页已经过期!’.
这些信息,而我们不得不刷新下才能正确显示,对于一个程序人员来说有可能无所谓,但是对于一个internet网上的一个顾客来说,看到该页面,他有可能关闭该页面,而不会去查看这些信息!
还有一个原因就是当一个网站流量比较大的时候,缓存是我们程序人员最好的工具,如果失去了这把工具,那么你所在的虚拟服务器必将受到考验!

解决办法为,

1、不使用session_start()函数。

2、在你的 Session_start 函数后加入 header("Cache-control: private"); 注意在本行之前你的PHP程序不能有任何输出。

还有基于session的解决方法,在session_start前加上
        session_cache_limiter('nocache');// 清空表单
        session_cache_limiter('private'); //不清空表单,只在session生效期间
        session_cache_limiter('public'); //不清空表单,如同没使用session一般

在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。

第一,使用Header方法设置消息头Cache-control
引用:
header(’Cache-control: private, must-revalidate’); //支持页面回跳
第二,使用session_cache_limiter方法
        session_cache_limiter('private, must-revalidate'); //注意要写在session_start方法之前

<meta  http-equiv="Cache-Control"   CONTENT="private,must-revalidate"> 

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (316人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------