网络编程
位置:首页>> 网络编程>> JavaScript>> 谈点关于checkbox的事情

谈点关于checkbox的事情

  发布时间:2010-09-28 14:49:00 

标签:checkbox,前端,Javascript

今天在开发一个手机短信通讯录的前端界面时,界面中使用了checkbox,来做为各项的选择控件,但是操作时,除了点差子。由于逻辑需要,需要预先选中用户上次选中的那些项目。但是当我使用javascript dom编程时,在IE系列浏览器中,直接在创建checkbox控件的时候无法让他默认选中。

情况是这样的,出于性能的考虑,我开始的做法是先创建一个文档碎片,然后讲所有的选择项循环加载到这个文档碎片中,当然这个时候我就设置了:

checkbox.checked = ture

然后再一次讲这包含大量选项的文档碎片加载到选项列表容器中,代码类似这样:

var optsList = document.getElementById('optsList');var optsDF = document.createDocumentFragment();var chkBox = [];for(var i =0; i < length; ++i){   chkBox[i] = Builder.Node('input',{       id: 'chkBox'+i,       value: i,       checked : (bChked) ? ture : false   });   optsDF.appendChild(chkBox[i]); }optsList.appendChild(optDF);

让我简单的说明下,为什么我要先创建文档碎片,先把列表项添加到文本碎片中,然后一次加到类表项容器中,而不直接把列表加载到类表项容器中。这个是由于如果直接这么做,浏览器就给在你每次添加列表项是,重绘页面(当你使用FIREBUG调试时,这个过程被放大,页面会闪烁一次)。这么做效率比较低,也占资源。所以我采用先将全部要的列表添加到文档碎片中,然后再添加到目标的列表框容器中,虽然这么做还多添加了一次,但是由于往文档碎片添加节点,页面是不会重绘的,所以反而会比较块,效率更高。

唉,可不幸的是,IE系列浏览器(IE6~8),它的逻辑是,如果你不把checkbox添加到页面文档中,你是不能设置它是否被选中的(虽然这逻辑似乎有点合理)。但这个不是我想要的结果,大家可以尝试下这两段代码:

代码一:var option = document.createElement('input');    option.value = '1';    option.checked = true;    option.type = 'checkbox';    document.body.appendChild(option);

代码二    var option = document.createElement('input');        option.type = 'checkbox';        option.value = '1';option.checked = true;    document.body.appendChild(option);

唯一的区别是,在代码二中我是在将checkbox添加到文档以后,再设置的checked = ture,而这么做,在IE和其他浏览器总都得到了选项被选中的状态。

唉,没有办法,为了兼容性,我只有采取我开始不愿采取的做法,直接讲选择项添加到列表框容器中。顺便说一句,除了Javascript中表示"非"的值false,‘’,null,0,NaN,undefined,checked设置其余任何值,都标识选中,比如:option.checked = 'false'。

所以,如果你的开发中也要使用DOM编程来实现加载时选中checkbox,要兼容的话,也只能采取我这种方法,先加载控件,然后再设置选中状态。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com