由IE一例处理comment节点的bug得到的结论

近期处理一个项目,需要“翻译”页面的注释节点。功能在Firefox下一切正常,项目进行非常顺利。拿到IE全系列下,却非常不正常,把注释翻译成ELEMENT Node,页面立刻飞掉。检查不出来原因,抓狂了好几天。

后来发现,问题出在IE渲染li的时候。我们的项目里,有时候要求注释节点需要插入在li的后面。虽然这不太标准,但是实际应用中,也是没办法的事。IE6+会把注释节点包进li里面,真是无语。

例如页面上的代码:

<ul id="test">
  <!-- comment_begin -->
  <li>asdf</li>
  <li>asdf</li>
  <li>asdf</li>
  <!-- comment_end -->
</ul>

试试document.getElementById(“test”).innerHTML,弹出:

<!-- comment_begin -->
<LI>asdf
<LI>asdf
<LI>asdf <!-- comment_end --></LI>

用IE8的开发者工具,也能看到同样的效果。IE其实是用这个代码来渲染页面的。最后的解决办法只好先“预处理”一下,把注释节点挪出来,大概是这样:

var lis = document.getElementsByTagName("li");
for (var i = 0, l = lis.length; i < l; i++) {
  if (lis[i].lastChild.nodeType === \8) {
    lis[i].parentNode.appendChild(lis[i].lastChild);
  }
}

这个bug说明一个问题,IE系列浏览器,包括IE8,内部的渲染还是使用的陈旧的HTML渲染方式,哪怕页面的文档类型DOCTYPE是xhtml。像这次遇到的问题,真是很难发现。IE浏览器真是无端耗费我们的青春啊!

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

1 Comment »

 
 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>