基于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 相关文章推荐
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
Jan 30 Javascript
js 格式化时间日期函数小结
Mar 20 Javascript
Script的加载方法小结
Jan 12 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
Sep 29 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
May 16 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
Nov 27 Javascript
详解组件库的webpack构建速度优化
Jun 18 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
解决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循环获取GET和POST值的代码
2008/04/09 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
Python深入学习之上下文管理器
2014/08/31 Python
Python 字典dict使用介绍
2014/11/30 Python
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
美国眼镜网:GlassesUSA
2017/09/07 全球购物
JAVA代码查错题
2014/10/10 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
农村优秀教师事迹材料
2014/08/27 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
五年级上册复习计划
2015/01/19 职场文书