The bugs cause IE crash
在开发easyajax的过程中,有一个应用案例,是用来进行数据库的增删改查的,在处理翻页的过程中,总是出现 IE 异常崩溃的现象。而且这个过程出现得很奇怪,在调试Javascript过程中,执行的每一行代码都不会导致这个错误的出现,但是在事件执行完毕,回到 IE后,就会让IE提示一个:系统异常,IE需要重新启动的错误。
这个错误也不是100%发生的,在有的情况下,需要反复翻页近100次才会出现,而有的时候则在第一次翻页时就出现了。相反,在Firefox等则不会报错。
经过反复的思考,后面总算发现了原因:
<table width="100%" border="0" cellpadding="1" cellspacing="1">
<tr bgcolor="#FFFFFF">
<td class="style3">ID</td>
<td class="style3">客户号</td>
<td class="style3">常用姓名</td>
<td class="style3">性别</td>
<td class="style3">国籍</td>
<td class="style3">证件类型</td>
<td class="style3">证件号码</td>
<td></td>
<td></td>
</tr>
<tbody jsclass="ajax.DataIteration" datasource="#{crud.entities}" variable="memberName" id="crud.listTemplate" style="display:none">
<tr >
<td class="style4">#{env.memberName.memberNamesId}</td>
<td class="style4">#{env.memberName.memberNo}</td>
<td class="style4">#{env.memberName.commonUseName}</td>
<td class="style4">#{env.memberName.commonUseSex}</td>
<td class="style4">#{env.memberName.commonUseCountry}</td>
<td class="style4">#{env.memberName.certificateType}</td>
<td class="style4">#{env.memberName.certificateNo}</td>
<td class="style4"><a href="#" onclick="modify();crud.edit(this.domBean.getEnv('index') );" jsclass="true"><img src="../../images/update_but.gif" border="0"/></a></td>
<td class="style4"><a href="#" onclick="crud.remove( this.domBean.getEnv('index') );" jsclass="true"><img src="../../images/del_but.gif" border="0"/></a></td>
</tr>
</tbody>
</table>
在这段代码中,ajax.DataIteration 施加在 tbody 对象上,在多行记录的情况下,也就是说tbody被重复了很多行。导致IE死亡的一个原因当然是这个DOM的不合法引起的(但是,如果能够给出一个很好的 报错的话,IE还是可以理解的,但不明就里的死掉,确实是程序鲁棒性作得不好的原因)。
如果把ajax.DataIteration 移到 tr 上,(当然这也是应该的),那么这个DOM就是一个合法的,自然也不会再导致IE死亡了。这个也给我们以后再碰到类似的问题时,如何解决这类问题提供了参考的经验:DOM操作如果不正确的话,IE是可能会死的。
经过这些时候遇到的这么多的问题,既让我们对ajax程序开发,要对多个浏览器提供很好支持,在开发、调试,发现问题等困难有了一定的了解,同时,也对于这些疑难问题,确实还是可以解决的,让ajax实用化,完全是可以的。
0 Comments:
张贴评论
<< Home