基于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的属性选择符和自定义选择符使用方法(二)
Apr 07 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
Vue父组件调用子组件事件方法
Feb 23 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
Jun 18 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 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语法速查表
2007/01/02 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
javascript中强制执行toString()具体实现
2013/04/27 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python将视频转换为全字符视频
2019/04/26 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
调解员先进事迹材料
2014/02/07 职场文书
服装发布会策划方案
2014/05/22 职场文书
生物学专业求职信
2014/07/23 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python