基于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 相关文章推荐
用javascript获取地址栏参数
Dec 22 Javascript
鼠标经过的文本框textbox变色
May 21 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
Dec 12 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
Dec 13 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
Jun 29 Javascript
JS校验与最终登陆界面功能完整示例
Jan 13 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
PHP5 面向对象程序设计
2008/02/13 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue实现文件上传功能
2018/08/13 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
vue解决跨域问题(推荐)
2020/11/10 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python迭代器和生成器介绍
2015/03/06 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
python sys.argv[]用法实例详解
2018/05/25 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Java语言的优势
2015/01/10 面试题
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
员工手册编写范本
2015/05/14 职场文书