基于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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
HTML node相关的一些资料整理
Jan 01 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
谈谈JavaScript中的几种借用方法
Aug 09 Javascript
详解获取jq ul第一个li定位的四种解决方案
Nov 23 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
微信小程序 picker-view 组件详解及简单实例
Jan 10 Javascript
javascript 取小数点后几位几种方法总结
Aug 02 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
May 08 Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 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学习之运算符相关概念
2011/06/09 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
Python用模块pytz来转换时区
2016/08/19 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
基于python实现坦克大战游戏
2020/10/27 Python
Django数据统计功能count()的使用
2020/11/30 Python
Python 求向量的余弦值操作
2021/03/04 Python
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
汽车促销活动方案
2014/03/31 职场文书
阳光体育活动总结
2014/04/30 职场文书
怎么写工作检讨书
2014/11/16 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
琅琊山导游词
2015/02/05 职场文书
执行力心得体会范文
2016/01/11 职场文书