基于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 相关文章推荐
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
适用于手机端的jQuery图片滑块动画
Dec 09 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
Sep 04 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
angular 服务随记小结
May 06 Javascript
查找Vue中下标的操作(some和findindex)
Aug 12 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 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
js验证表单大全
2006/11/25 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
利用Python破解验证码实例详解
2016/12/08 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
python实现括号匹配的思路详解
2018/08/23 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python列表对象实现原理详解
2019/07/01 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
大三自我鉴定范文
2013/10/05 职场文书
函授生自我鉴定
2014/03/25 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
给病人的慰问信
2015/03/23 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
创业计划书之书店
2019/09/10 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python