基于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 相关文章推荐
我也种棵OO树JXTree[js+css+xml]
Apr 02 Javascript
用javascript实现给出的盒子的序列是否可连为一矩型
Aug 30 Javascript
JavaScript 继承详解(一)
Jul 13 Javascript
window.onload追加函数使用示例
Mar 03 Javascript
javascript实现日期格式转换
Dec 16 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
Jan 06 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
Mar 29 Javascript
javascript实现手动点赞效果
Apr 09 Javascript
react中props 的使用及进行限制的方法
Apr 28 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
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python匿名函数及应用示例
2019/04/09 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python3下pygame如何实现显示中文
2020/01/11 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
中间件的定义
2016/08/09 面试题
UNIX文件系统分类
2014/11/11 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
计生专干事迹
2014/05/28 职场文书
普通话宣传标语
2014/06/26 职场文书
检讨书格式范文
2015/05/07 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书