基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍


Posted in Javascript onMay 07, 2013

检查bug的步骤

1. bug定位

在js脚本中,按照脚本执行的顺序,你可以用console或alert,来确定bug发生的代码区间,然后在区间内进一步来查找bug发生的具体代码段。

2. bug fix

通过排除,就是在插入节点内容的时候导致了bug,我用的是kissy的DOM.html()方法,其功能类似于DOM元素节点innerHTML方法,我起初认为是这个方法导致的IE6\7渲染出错,然后我换成了innerHTML方法,结果还是有误。

这时候我想到了内存泄露,看看是不是在循环拼接字符串的过程中,有循环引用或者其他原因造成内存泄露,然后在一些方法结束的时候,我把一些变量赋值null,来防止内存泄露(虽然不知道是否有效,但是至少我这么尝试过了),结果还是不行。

是不是数据过多,导致一下子渲染的时候崩溃呢?于是我减少了拼接的数据长度,这个起效了。1~3条数据的时候,可以渲染上,那就说明方法是没有错的;但是3条以上的数据,IE6\7还是无法响应。于是我又试着一条一条数据取持续插入,因为一次插入1条数据没有问题的话,我大不了多插入几次吧,但是IE还是有问题。其实,这时候我的思路已经偏离了。

后来找同事来看看,说之前也碰到过这个问题,是IE6\7下,标签没有正确闭合的原因导致的。没错,这就是这个bug的真正原因啦。后来,我把拼接的字符串打印出来,然后再使用格式化工具进行格式化,变很快发现了我拼接字符串的时候出现的这个问题,于是很快fix掉这个bug。我用的在线格式化工具:http://tool.chinaz.com/Tools/JsFormat.aspx

3. 测试

测试时候,我们写上一串html代码,并对一些标签不闭合,看看IE和chrome对比情况。

代码如下,在第二个li标签里,我们对ul标签中的其中一个<span>标签,做不闭合处理

<ul>
 <li>
  <ul>
   <li>inner li</li>
   <li>inner li</li>
   <li>inner li</li>
  </ul>
 </li>
 <li>
  <ul>
   <li>inner li</li>
   <li>inner li</li>
   <li>inner li
   <span>not closed<span>error happend</span></li>
  </ul>
 </li>
 <li>
  <ul>
   <li>inner li</li>
   <li>inner li</li>
   <li>inner li</li>
  </ul>
 </li>
</ul>

IE 和chrome下都正常显示,如上图。

接下来通过开发工具调试看看。

在IE7~9下面,dom结构错乱,发送错误的地方就在那个没有闭合的<span>标签那里,原来的第三个<li>节点的内容直接插到了<span>节点下面。

我们再来看看chrome下面的情况吧:第三个li正常的渲染到dom树里面,在发生错误的span标签那里,自动补上了一个span的闭合标签

4. 总结

各个浏览器在渲染html的时候表现不一样,尤其是IE浏览器同其他的浏览器。chrome和FF的容错性能很好,即使页面中存在html标签没有正常闭合,它也会智能的进行识别,并使其在浏览器中看上去无恙,且最终的DOM结构也没有问题,然而不好的一面就是你不知道你的代码有错,还以为一切正常。而IE8\9现在也可以这样处理,看上去页面内容没有问题,但是呢,通过开发工具,你可以看到错误的html代码没有正常的DOM结构。但是IE6\7就不会给你这样的机会,要么就直接崩溃了。

chrome可以容许我们犯错,而IE却对我们更加严格,虽然IE让我们很头疼,但是却对我们的代码提出了更高的要求!忽然觉得,有IE也蛮好的。。。

如果有一天,你发现IE下dom结构都无法渲染出来的时候,记得提醒自己,是否代码中有标签没有闭合。

Javascript 相关文章推荐
Prototype使用指南之base.js
Jan 10 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
Jun 11 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
Oct 13 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
微信小程序实现文字跑马灯效果
May 26 Javascript
Vue中使用vux配置代码详解
Sep 16 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 jQuery
vue遍历生成的输入框 绑定及修改值示例
Oct 30 Javascript
js实现点击烟花特效
Oct 14 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
May 07 #Javascript
jQuery的slideToggle方法实例
May 07 #Javascript
jQuery实现动画效果的实例代码
May 07 #Javascript
nullJavascript中创建对象的五种方法实例
May 07 #Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
May 07 #Javascript
javascript中的startWith和endWith的几种实现方法
May 07 #Javascript
js 获取和设置css3 属性值的实现方法
May 06 #Javascript
You might like
用 php 编写的日历
2006/10/09 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
实现Python与STM32通信方式
2019/12/18 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
银行毕业实习自我鉴定
2013/09/19 职场文书
手机银行营销方案
2014/03/14 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
园林技术专业求职信
2014/07/28 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
给医院的感谢信
2015/01/21 职场文书
中秋节寄语2015
2015/03/24 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
学习经验交流会总结
2015/11/02 职场文书
2016十一国庆节感言
2015/12/09 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
八年级作文之感恩
2019/11/22 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript