当前位置: 代码迷 >> JavaScript >> js统制浏览器的返回按钮
  详细解决方案

js统制浏览器的返回按钮

热度:542   发布时间:2013-02-24 17:58:56.0
js控制浏览器的返回按钮

文章收集了与参考了大量的关于javascript禁用浏览器后退按钮实现代码,有需要的朋友可以看看。

?

1、

<script language="JavaScript">

???????? javascript:window.history.forward(1);

</script>

利用JS产生一个“前进”的动作,以抵消后退功能,这种方法应该是最简洁的,并且不需要考虑用户连点两次或多次“后退”的情况,缺点是当用户端禁用了JavaScript之后即失效。

?

?

2、

<A HREF="logout.do" onclick="javascript:location.replace(this.href); event.returnValue=false; ">???????????

Logout (Back Disabled)

</A>

用location.replace从一个页面转到另一个页面。这种方法的原理是,用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远不会变为可用。我想这可能正是许多人所寻求的方法,但这种方法仍旧不是任何情况下的最好方法。这种方法的缺点在于:简单地运用Response.Redirect将不再有效,这是因为每次用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。另外还要注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。

?

?

3、

当键盘敲下后退键(Backspace)后??
1、禁止浏览器自动后退??
2、但不影响密码、单行文本、多行文本输入框等的回退操作

<script type="text/javascript">??
??
//处理键盘事件 禁止后退键(Backspace)密码或单行、多行文本框除外???
function banBackSpace(e){?????
??? var ev = e || window.event;//获取event对象??????
??? var obj = ev.target || ev.srcElement;//获取事件源??????
??????
??? var t = obj.type || obj.getAttribute('type');//获取事件源类型?????
??????
??? //获取作为判断条件的事件类型???
??? var vReadOnly = obj.getAttribute('readonly');??
??? var vEnabled = obj.getAttribute('enabled');??
??? //处理null值情况???
??? vReadOnly = (vReadOnly == null) ? false : vReadOnly;??
??? vEnabled = (vEnabled == null) ? true : vEnabled;??
??????
??? //当敲Backspace键时,事件源类型为密码或单行、多行文本的,???
??? //并且readonly属性为true或enabled属性为false的,则退格键失效???
??? var flag1=(ev.keyCode == 8 && (t=="password" || t=="text" || t=="textarea")???
??????????????? && (vReadOnly==true || vEnabled!=true))?true:false;??
?????
??? //当敲Backspace键时,事件源类型非密码或单行、多行文本的,则退格键失效???
??? var flag2=(ev.keyCode == 8 && t != "password" && t != "text" && t != "textarea")??
??????????????? ?true:false;??????????
??????
??? //判断???
??? if(flag2){??
??????? return false;??
??? }??
??? if(flag1){?????
??????? return false;?????
??? }?????
}??
??
//禁止后退键 作用于Firefox、Opera???
document.onkeypress=banBackSpace;??
//禁止后退键? 作用于IE、Chrome???
document.onkeydown=banBackSpace;??
??
</script>

以上方法都是针对“后退”按钮作出的反应,客户端浏览器需要打开JavaScript代码。

?

?

?

4、禁止缓存

<%??????

??????????? response.setHeader("Cache-Control", "no-cache");?????????

??????????? response.setHeader("Cache-Control", "no-store");????????

??????????? response.setDateHeader("Expires", 0);

??????????? response.setHeader("Pragma", "no-cache");

%>

这种方法使用服务器端脚本,强制浏览器重新访问服务器下载页面,而不从缓存读取,结合struts jsp页面中的<logic>标签实现重新定向。

以上各种方法都有一定的局限

?

?

5、

<script language="JavaScript">

function logout(){

??? window.close(true);

??? window.open("logout.do");

}

</script>

<button onClick="logout()">Logout</button>

这种方法比较偷懒,关掉浏览器再重新开,经过我的测试在视觉上几乎感觉不出来延时,同时又保证了后退按钮不可用(新窗口浏览器后退按钮为灰色),看起来似乎是个好方法,但缺点也比较明显:

首先,关闭和重开的浏览器窗口大小可能不同,用户可以明显看出这一过程,并且在一定程度上影响操作。

其次,同上,这是一个JavaScript方法。

?

我的练习中是用struts完成的Login/Logout过程,在loginSuccess.jsp页面中加入了<logic>标签:

<logic:notPresent name="helloForm">

?????????? <logic:redirect page="/logout.do"></logic:redirect>

</logic:notPresent>

通过判断formBean是否存在决定是否跳转,结合上述的JavaScript方法即可以保证用户在注销后无论通过后退还是直接在地址栏输入业务页面地址都将无法返回页面。

  相关解决方案