基于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 相关文章推荐
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
Feb 25 Javascript
jquery ajax中使用jsonp的限制解决方法
Nov 22 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
Jan 21 Javascript
基于vue+canvas的excel-like组件实例详解
Nov 28 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 Javascript
Node.js Domain 模块实例详解
Mar 18 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
Python中函数的用法实例教程
2014/09/08 Python
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python 排序算法总结及实例详解
2016/09/28 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
新学期校长寄语
2014/01/18 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
资料员岗位职责范本
2015/04/13 职场文书
期中考试后的感想
2015/08/07 职场文书
班级班风口号大全
2015/12/25 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA