`
xingqiliudehuanghun
  • 浏览: 7136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由于html标签嵌套错误引发的一些问题

阅读更多
    前一阵写代码的时候遇到了一些很莫名奇妙的现象,代码的运行结果与我的预期出入很大,但是程序本身并没有错误。当时我正在为自己写的一个小程序写文档,格式为html,因为有很多的JS代码,为了便于阅读自己添加了一些实现代码高亮显示的代码。代码并不是很复杂,当时我的页面中存在很多这种结构的HTML:
<h2>sub title</h2>
<p>
  some text
  <xmp id="code" style="display:none;">
    some javascript codes;  
  </xmp>
</p>

因此我写了一个程序
var i, len, code, p, xmp, xmps = document.getElementsByTagName('xmp');
for(i=0, len=xmps.length; i<len; i++){
   xmp  = xmps[i];
   code = xmp.innerHTML;
   p = document.createElement('p');
   p.innerHTML = gitHighLightCode(code);
   xmp.parentNode.appendChild(p);
}

但运行之后却发现Firefox和Chrome下高亮显示的代码被紧挨着显示了通过在Google上搜索很快找到了答案:错误的标签嵌套。我原本希望我的代码运行后形成下面的HTML结构:
<h2>sub title</h2>
<p>
  some text
  <xmp id="code" style="display:none;">
    some javascript codes;  
  </xmp>
  <p>  
     high light codes....  
  </p>
</p>

但按照w3c的规范这p标签内部包含行inline标签,不能包含block标签,而xmp p恰好是block标签,所以属于非法嵌套。浏览器做了自动容错处理,在代码初始化的时候把XMP标签提到了p标签的外层变成了body的子节点,也就是如下的结构:
<h2>sub title</h2>
<p>
  some text
</p>
<xmp id="code" style="display:none;">
    some javascript codes;  
</xmp>

因此运行后就变成了如下的结构
<h2>sub title</h2>
<p>
  some text
</p>
<xmp id="code" style="display:none;">
    some javascript codes;  
</xmp>
<p>
   high light codes....
</p>

知道原因之后做了写调整把xmp换成了textarea,这样应该就没问题了。运行之后FireFox确实如我预期生成了我要的代码结构,但IE下居然报错了:"未知的运行时错误",这个错误让人摸不着头脑。又Google了下发现还是嵌套错误引起的。原来我的代码高亮程序生成的html代码会在最外层生成一个div,因此用来显示代码的p标签内部嵌套了一个div, 而IE在对innerHTML赋值的时候对结构进行检查,如果发现标签嵌套错误就会报这个让人摸不到头脑的错误。如果你想引发这个错误可以尝试如下代码:
p = document.createElement('p');
p.innerHTML = '<p>code</p>';

其他浏览器虽然不会报错,但一旦遇到非法嵌套浏览器都会做自动容错处理,很多时候得到
的结果和我们原来的也不一样,比如下面的代码:
p = document.createElement('p');
p.innerHTML = '<p>code<p>code</p></p>';
document.body.appendChild(p);
alert(p.innerHTML); //输出结构为<p>code</p><p>code</p><p></p>


经过这一折腾我估计标签签嵌套会引发的错误让我差不多都尝了一遍。结论有几个:
  1. 请严格按照w3c规范正确的嵌套标签否则浏览器会做自动容错处理,导致与我们预期不符的标签结构

  2. p标签虽然为block标签但内部只允许出现inline标签,不允许出现其他block标签,因此不用在内部使用p、div、xmp等block标签

  3. 如果使用innerHTML设置标签的内部HTML结构,IE会对标签结构做检查,如果出现非法嵌套会报错误:"未知的运行时错误"



分享到:
评论

相关推荐

    升级补丁tongWeb7.0.4.2-3单双引号标签问题.zip

    例如,如果一个HTML标签的属性值中包含一个未闭合的引号,解析器可能无法正确解析后续的代码,从而引发错误。在更复杂的应用场景中,如JSP或Servlet中,错误的引号使用可能导致Java语法错误,进而影响服务器处理请求...

    HTML网页内容解析器源码

    10. **线程安全**:如果解析器可能在多线程环境中使用,那么它必须是线程安全的,确保并发访问不会引发问题。 Delphi的HtmlParser库提供了这些功能,允许开发者在Delphi应用程序中轻松解析和操作HTML内容。通过使用...

    s30801.tsr.zip_TSR_The Element

    3. 结束标签顺序错误:如果嵌套元素没有按正确的顺序关闭,也会引发此错误。 解决这个问题通常涉及检查和修复XML或HTML文档的手动编辑,确保每个开启的元素都有对应的结束标签,并且它们匹配无误。对于大型或复杂的...

    struts常见问题列表

    5. **JSP标签错误**:Struts提供了一系列标签库,如logic、bean、html等,它们简化了视图层的开发。如果标签使用不当,可能会引发异常。检查标签的语法、属性和嵌套关系是否正确。 6. **异常处理**:Struts默认使用...

    html代码美化工具js代码美化

    例如,它可以将连续的HTML标签通过缩进和换行分开,使复杂的嵌套结构变得井然有序。此外,它还能按照一定的编码风格调整标签的大小写,如将所有标签转换为全小写或全大写,以符合W3C标准。 对于JS(JavaScript)...

    中国移动技术文档-HTML编码规范

    - 解释:同一页面中出现重复的`id`会导致逻辑错误,尤其是在使用`getElementById`时,可能引发难以追踪的问题。 - 推荐使用小写字母,单词间用短横线分隔,并保持项目内一致性。 - **避免滥用class**: - 禁止仅...

    JSTL详细标签库介绍

    以下这些情况都可以引发异常:您的代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运行库遇到意外情况(如无法验证代码),等等&lt;BR&gt;&lt;BR&gt;《Exception Handling for C++》关于异常处理论文,向...

    HTML和CSS面试题及答案.pdf

    3. 无序列表的HTML标签是`&lt;ul&gt;`,选项A是正确的。 4. `show`、`hide`和`hidden`类在CSS中常用于显示或隐藏元素,但`text-hide`并不直接隐藏文字,而是通过CSS技巧让文字不可见,但仍然保留其占据的空间,所以D选项...

    asp之自动闭合HTML/ubb标签函数 附简单注释

    在ASP(Active Server Pages)开发中,有时我们需要处理用户输入的HTML或UBB(User Bar Bulletin Board)代码,确保它们是正确闭合的,以防止潜在的安全问题和格式错误。这里介绍的两个函数,`closeUBB` 和 `close...

    免费 HtmlAgilityPack分析工具

    5. **错误处理**:HtmlAgilityPack能够处理解析过程中遇到的常见错误,比如无效的HTML标签或属性,使得开发者可以处理各种复杂情况下的网页。 6. **兼容性**:HtmlAgilityPack支持多种.NET平台,包括.NET Framework...

    Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法

    1. **破损的HTML标签**:当你尝试通过innerHTML添加的HTML代码中存在破损的标签,例如未闭合的`&lt;li&gt;`或`&lt;div&gt;`标签,IE浏览器可能无法正确解析,从而导致运行时错误。 2. **不合法的嵌套**:在某些情况下,IE对特定...

    html工作中表格&amp;lt;tbody&amp;gt;标签的使用技巧

    如果尝试像以下这样嵌套tbody,将会引发不符合预期的错误: ```html &lt;tr&gt;&lt;td&gt;表单内容&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;多行内容&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;多行内容&lt;/td&gt;&lt;/tr&gt; ``` 这样的用法是错误的,不仅违反了W3...

    Javascript里的String原来不能用双引号括起来.jpg

    上面的例子中,由于字符串内部也使用了双引号,这将导致JavaScript解释器无法正确识别字符串的结束位置,从而引发语法错误。为了解决这个问题,通常有以下几种方法: 1. **转义字符**:使用反斜杠(`\`)对内部的双...

    网页布局中CSS样式无效的十个重要原因详解

    1. **embed标签问题**:由于embed标签是非标准的HTML标签,W3C验证程序可能无法识别,这可能导致CSS样式失效。为保持严格验证,可以使用Flash Satay方法来实现嵌入式媒体。 2. **未闭合的div标签**:未闭合的div...

    完美解决IE9浏览器出现的对象未定义问题

    在Windows 7操作系统中,IE9(Internet Explorer 9)作为一个流行浏览器,因其对Web标准的严格遵循,可能会引发一些兼容性问题,特别是在与Chrome、Firefox、IE6、IE7和IE8等其他浏览器对比时。其中一种常见问题是...

    Web前端编码规范

    6. **标签嵌套**: - 不允许出现交叉嵌套的语句。 7. **图片alt属性**: - 图片元素必须包含`alt`属性,并提供与图片内容相关的描述。 8. **文件扩展名**: - 文件名后缀应统一使用`.html`。 9. **代码缩进**...

    2022web前端面试题

    10. `iframe`缺点:iframe可能导致页面加载性能下降,不利于SEO,且可能引发跨域安全问题。 11. HTML5新特性:包括离线存储、拖放功能、Geolocation定位、Web Workers后台处理、WebSocket实时通信、WebRTC视频通信...

    格式化代码插件 tidy2

    tidy2是一款强大的代码...tidy2对于前端开发者来说是一款非常实用的工具,它可以帮助保持代码整洁,减少因格式问题引发的错误,提升开发效率。通过熟练掌握tidy2的使用,你可以让代码更具一致性,更容易阅读和维护。

Global site tag (gtag.js) - Google Analytics