当前位置: 首页 > 图文教程 > 网络编程 > Javascript > IE中checkbox在刷新后初始化的问题

Javascript
Javascript的匿名函数小结
js跟随滚动条滚动浮动代码
js监听表单value的修改同步问题,跨浏览器支持
JavaScript 模拟用户单击事件
javascript 获取表单file全路径
让IE8支持DOM 2(不用框架!)
javascript控制frame,iframe的src属性代码
JavaScript 井字棋人工智能实现代码
javascript showModalDialog模态对话框使用说明
JavaScript 学习笔记(四)
JavaScript 学习笔记(五)
JavaScript 学习笔记(六)
JavaScript 学习笔记(七)字符串的连接
js下用gb2312编码解码实现方法
javascript 面向对象技术基础教程
javascript eval和JSON之间的联系
JavaScript 数组循环引起的思考
url 特殊字符 传递参数解决方法
jQuery animate(滑块滑动效果代码)
用javascript做一个小游戏平台 (二) 游戏选择器

Javascript 中的 IE中checkbox在刷新后初始化的问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-02-27   浏览: 341 ::
收藏到网摘: n/a

在项目中有一个需求,要求页面中的checkbox在页面刷新或后退时都要重新初始化,即处于未选中的状态,不保存之前的状态。 初一看这个功能很简单,一个checkbox,加一段脚本,把这个checkbox的checked属性设为false。
复制代码 代码如下:

<input type="checkbox" id="chk_UnInital" name="chk_UnInital" />
<script>document.getElementById("chk_UnInital").checked=false;</script>

这段代码在firefox等其它浏览器中都能实现这个需求,维独在IE中死活不行,每次把勾勾上,无论是刷新还是后退,这个勾都是勾上的。
难道是在IE下这段代码没工作?
验证一下,在这段脚本前后各加一个alert,发现在执行这checked=false之前和之后这个checkbox都是未选中的,当把警告框确定后,这个勾反而出现了!
这说明在后面的页面加载顺序中,某个事件又把这个checkbox设为true了,先试着在页面onload里再执行这段脚本
复制代码 代码如下:

<script>
window.onload=function(){
  alert("before");
  document.getElementById("chk_UnInital").checked=false;
}
</script>

果然发现在执行alert("before");时这个勾是选中的,这说明在onload事件之前这个勾就被浏览器自动选上了,具体是什么原因就涉及到IE内部的机制了。
将这个function注册在onload事件里,到这里这个需求就实现了。
然而onload是在页面所有的元素都加载完后才会执行,在本地测试的时候有一个请求返回很慢,从而使onload事件迟迟不能执行,这是我们不愿意看到的。
后来发现网站上另一处checkbox在页面刷新时不会保存之前的状态,经过仔细对比之后发现这个input多了一个checked=""属性:
<input type="checkbox" id="chk_Inital" name="chk_Inital" checked="" />
有了这个属性后,事件不用放在onload里也能起作用了
这是什么原因呢?
接着做以下试验:
复制代码 代码如下:

<input type="checkbox" id="chk_UnInital" name="chk_UnInital" />
<label for="chk_UnInital">This checkbox can't be Inital</label>
<br>
<input type="checkbox" id="chk_Inital" name="chk_Inital" checked=""/>
<label for="chk_Inital">This checkbox can be inital</label>
<br>
<script>
//window.onload=function(){
var chks=document.getElementsByTagName("input");
for(var i=0,l=chks.length;i<l;i++){
  alert(chks[i].id);
  chks[i].checked=false;
}
//}
</script>

为了便于叙述,我们这里将上面这段脚本的执行时间称为t1,window.onload的执行时间称为t3,这之间的执行时间称为t2
通过加入alert后,对比发现:
      chk_UnInital  chk_Inital
脚本放在script块中执行:
t1之前    未选中      选中
t1之后    选中      未选中
下面是放在onload中执行:
t3之前    选中       选中
t3之后    未选中      未选中
发现加checked=""后在t1之前即为选中状态,然后被t1置为unchecked。
总结:
方案一:在onload事件里处理
方案二:加上checked属性

[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]