IE6 select BUG:无法设置selected属性 未指明的错误

.最近在做js选择select的时候,莫名其妙的在IE6中报了一个“无法设置selected属性 未指明的错误”,谷歌和度娘搜了一圈,发现也有不少人遇到同样的bug,给出的解决方案,几乎都是增加一个setTimeout:

setTimeout(function(){
  selectObj.val(defaultSelect);//选中指定项
},0);

细测下来发现一个很奇特的现象,在js抛出错误之前,其实已经完成了选择。抛出错误之后,js代码随即停止运行。 用上述方案之后,虽然后续的js可以执行,但用setTimeout“延迟执行”,虽然解决了问题,但是看起来却感觉有点“不靠谱”。 既然是选择完成之后抛出错误,并不影响当前的选择,那么可不可以用try catch语句来捕捉错误呢?于是尝试用下面的方法:

try {
  selectMonth.val(oldMonth);//选择指定项目
} catch (e) {
}

发现真的可以执行了,但是继续测试下去,发现这种try...catch只能针对3个以下(我测出来的是3可能会有不同)连续选择有效。大于这个数目还是需要用到setTimeout的如下:

//连续3次选择年、月、日的实验
try {
  selectYear.val(oldYear);//第一次选择年,可以用try catch来捕捉错误。
} catch (e) {
}

try {
    selectMonth.val(oldMonth);//连续第二次选择,仍然可以用该方法。
} catch (e) {
}
//连续第三次选择,如果直接用tyr catch可能会报错,所以我加上了个setTimeout
setTimeout( function () {
    try {
        selectDate.val(oldDate);
     } catch (e) {
    }
 }, 0 );

总结:个人觉得处理这个问题的时候用try catch会比单纯的setTimeout要好一点,但是究竟这个错误是什么原因引起的,还有待考虑,个人猜测好像是select里面的option加载会有一点点延迟,有点像异步的感觉,最终导致了上述的bug产生。当然,如果有哪位高人知道其中的“真谛”也请不吝赐教。

Write a response...
Mofei Zhu
publish