基于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 用记忆函数快速计算递归函数
Mar 15 Javascript
关于JavaScript的变量的数据类型的判断方法
Aug 14 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
May 13 Javascript
js+canvas绘制图形验证码
Sep 21 Javascript
js实现弹框效果
Mar 24 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
一个SQL管理员的web接口
2006/10/09 PHP
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php 安全过滤函数代码
2011/05/07 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
php while循环控制的简单实例
2016/05/30 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python requests指定出口ip的例子
2019/07/25 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
行政管理专业推荐信
2013/11/02 职场文书
小学英语课后反思
2014/04/26 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL