基于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 动态扩展对象之另类视角
May 25 Javascript
div模拟选择框示例代码
Nov 03 Javascript
js创建元素(节点)示例
Jan 02 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
javascript内置对象操作详解
Feb 04 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
Jun 25 Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 Javascript
前端开发必知的15个jQuery小技巧
Jan 22 Javascript
JavaScript实现星级评价效果
May 17 Javascript
详解webpack-dev-middleware 源码解读
Mar 23 Javascript
Element PageHeader页头的使用方法
Jul 26 Javascript
JS canvas实现画板和签字板功能
Feb 23 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
php实现搜索类封装示例
2016/03/31 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
python多个模块py文件的数据共享实例
2019/01/11 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python3.8 微信发送服务器监控报警消息代码实现
2019/11/05 Python
Python API自动化框架总结
2019/11/12 Python
Python 使用type来定义类的实现
2019/11/19 Python
开展批评与自我批评发言稿
2014/10/16 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
初中政治教师教学反思
2016/02/23 职场文书
小学思想品德教学反思
2016/02/24 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
Python中的嵌套循环详情
2022/03/23 Python