日期:2014-05-16  浏览次数:20333 次

javascript:void(0)与# 我所遇到了问题

刚好把项目的大体完善了。现在回想一下之前我所遇到的一些细节问题,特别是花费了我很多时间。(以下的例子在我的member.jsp和member.js)

一个是我对记录进行删除的时候,页面没有刷新 第二个是:我对于注销登录进行操作的时候,页面没有刷新(注明:注销登录在火狐,谷歌,ie8正常,但是在ie6失败).后来发现问题都与 javascript:void(0),#之间的区别有关。

于是我开始在网上搜索一番查看两者之间的区别:

"#"包含了一个位置信息 默认的锚点是#top 也就是网页的上端
<a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP(实际测试发现 滚动条会滚到顶端)
而javascript:void(0) 仅仅表示一个死链接,例如:<a href="javascript:void(0)" > 点击链接后,页面不动。
<a href="#" onclick="javascript:return false;"> 作用同上。
点击链接后,不想使页面滚到页首(顶部),就用href="javascript:void(0)",不要用href="#"
如果是个# ,就会出现跳到顶部的情况,收藏的几种解决方法(保持页面不会到顶端的方法):
1:<a href="####"></a>
2:<a href="javascript:void(0)"></a>
3:<a href="javascript:void(null)"></a>
4:<a href="#" onclick="return false"></a>

下面是我测试的一个例子:

<a href="#" onClick="del(${member.memberId});return false;"><img src="<%=ctxPath%>/image/admin/btn_delete.gif"/>删除</a> 注意这里面加了一句,作用在于 当弹出confirm对话框的时候 我单击取消的时候 页面不动,如果不加的话,单击取消操作,滚动条会向顶端滚动。

JavaScript中void(0)的含义:
JavaScript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值。
void 操作符用法格式如下:
1. javascript:void (expression)
2. javascript:void expression
expression是一个要计算的 JavaScript 标准的表达式。表达式外侧的圆括号是可选的,但是写上去是一个好习惯。我们可以使用 void 操作符指定超级链接。表达式会被计算但是不会在当

前文档处装入任何内容。面的代码创建了一个超级链接,当用户点击以后不会发生任何事。当用户点击链接时,void(0) 计算为 0,但在 JavaScript 上没有任何效果。
<a href="javascript:void(0)">单击此处什么也不会发生</a>
也就是说,要执行某些处理,但是不整体刷新页面的情况下,可以使用void(0),但是在需要对页面进行refresh的情况下,那就要仔细了。 我们可以这样用<a href="javascript:void(document.form.submit())">,这句话会进行一次submit操作,使页面refresh。像我们一般的记录的修改,删除等等 需要页面相应的刷新!

我的例子:

<a href="javascript:void(document.mainForm.submit())" onClick="del(${member.memberId});"><img src="<%=ctxPath%>/image/admin/btn_delete.gif"/>删除</a>
这样一个document.mainForm.submit() 代替了 jsp页面中js文件的$("#mainForm").submit();使得页面刷新了。
那什么情况下用void(0)比较多呢,无刷新,当然是Ajax了,看一下Ajax的web页面的话,一般都会看到有很多的void(0),:),所以在使用void(0)之前,最好先想一想,这个页面是否需要

相应的刷新。

下面是我在网上搜索的一个与我注销登录遇到相似的问题,先看他的说法:

为什么location.href不自动跳转?慎用javascript:void(0)
<a href="javascript:void(0)" onclick="delete('123')">删除</a>
<script>
function delete(id) {
if(confirm("确实要删除[为什么location.href不自动跳转?]吗?")) {
location.href="/delete.jsp?id=" + id;
}
}
以上代码不管如何检查都没有任何问题,而location.href="/delete.jsp?id=" + id;在别的地方都好使,为什么这段代码就行呢?
原因是那个void(0),把代码改成:
<a href="javascript:delete('123')">删除</a>
<script>
function delete(id) {
if(confirm("确实要删除[为什么location.href不自动跳转?]吗?")) {
location.href="/delete.jsp?id=" + id;
}
}

我的注销登录最终的解决方法:

我的注销登录:
decorator.jsp
<li><a href="#" onClick="logout()">注销</a></li>
对应的js文件
function logout(){
if(confirm("确定要退出管理后台系统吗?"))
parent.window.location= ctxPath+"/console/logout.do";
}
可以成功注销登录。
按照上面的方法:
decorator.jsp
<li><a href="javascript:logout()">注销</a></li>
对应的js文件
function logout(){
if(confirm("确定要退出管理后台系统吗?"))
parent.window.location= ctxPath+"/console/logout.do";
}
也可以可以成功注销登录。
但是如果我的jsp页面换成<li><a href="javascript:void(0);" onClick="logout()">注销</a></li>
对应的js文件
function logout(){
if(confirm("确定要退出管理后台系统吗?"))
parent.window.location= ctxPath+"/console/logout.do";//这里我在在logoutAction中把session值清空 然后在struts中配置跳转的路径/login.jsp
}
注销失败,页面不能正常的跳转。必须再次刷新页面,才可以。

可以看出想要页面进行刷新 javascript:void(0)真的是慎用!

我的删除操作也是和上面一样 。源于javascript:void(0) 我的页面删除后 同样要对页面记录进行刷新!

改成了<a href="#" onClick="del(${member.memberId});"><img src="<%=ctxPath%>/image/admin/btn_delete.gif"/>删除</a>这样才可以。或者 <a href="javascript:void(document.mainForm.submit())" onClick="del(${member.memberId});"><img src="<%=ctxPath%>