HH8001: 在 Firefox 中注释内容中如果包含 '-' 字符在某些情况下会使该注释解析错误

标准参考
注释元素(Comment Element)的作用是,注释一行或多行 HTML 代码,在注释标签内的文本不被显示,但对通过查看页面源码的方式还是可见的。

注释标签的标准写法如下:

// 单行注释
<!-- this is a comment -->

// 多行注释

<!-- and so is this one,
     which occupies more than one line -->

另,根据 W3C HTML 4.01 文档中的描述,需注意以下几点:

注释元素的开始标签 “<!” 和 “--” 之间不允许有空白符存在,但是在各浏览器下就算它们之间存在空白符,也能被正确的识别,如下代码所示:
// 此处的注释,在各浏览器下,都能被作为注释标签正常识别
<! -- this is a comment --> 
注释元素的关闭标签 “--” 和 “>” 之间允许有空白符存在。
应避免在注释内容中出现两个或以上的“-”字符,否则可能会出错。
关于 HTML 注释的更多说明,请参考 HTML 4.01 规范 3.2.4 中的内容。

问题描述
注释内容含中横线(-)在 Firefox 中可能会使中间内容丢失。

造成的影响
这个问题将导致页面中的注释部分在 Firefox 标准模式(S)下被当做文本内容解释出来,从而造成文本内容异常甚至影响到页面布局。

受影响的浏览器
Firefox(S)  注释的内容连同注释标签本身被当做纯文本解析并渲染到页面上。
问题分析
W3C HTML 4.01 文档中提到,注释标签中存在两个或两个以上相连的连字号 ("-") 时,注释标签将出错。此情况只在 Firefox(S) 下出现,而在其它浏览器下,则不会出错。

以下讨论仅针对 Firefox(S) ,因为其它浏览器下均正常。

1. 出错条件

观察如下HTML代码:

<!-- 这里是注释内容 -  -->
记录测试结果,然后增加注释标签内的连字号数量,如下:

<!-- 这里是注释内容 --  -->
再次记录测试结果,重复以上步骤N次,整理结果如下:

注释标签中相连连字号数量    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  ...
测试结果1   T   F   F   T   T   F   F   T   T   F   F   T   T   F   F   T   T   F   F   ...
【注】
1. F-出错;T-正常。
从上表可以看出,当注释标签中相连连字号数量为2的奇数倍、或2的奇数倍加1时,Firefox(S) 下注释标签出错。

另,改变相连连字号的位置,不影响测试结果,例如:改变如下

<!-- 这里是---注释内容 --><!-- ---这里是注释内容 -->
2. 一个注释中多个地方出错时

观察如下代码:

// case 1:
<!-- -- a -->
// case 2:
<!-- -- a -- -->
// case 3:
<!-- -- a -- b --  -->
// case 4:
<!-- -- a -- b -- c -- -->
......
注意:代码中红色部分,只要满足【(A)情况一】中出错条件即可。

以上代码在各浏览器下的表现,汇总如下表:

case x  1   2   3   4   5   6   7   8   9   ...
测试结果1   F   T   F   T   F   T   F   T   F   ...
【注】
1. F-出错;T-正常。
从上表中可以看出,当注释中有多处出错时,满足负负得正的规律,即出错了偶数次时,相当于没出错,此时注释标签解析正常,反之,如果出错了奇数次,此时注释标签将出错。其实,【(A)情况一】中的出错条件也可以用负负得正的规律来解释。

3. 两个出错的注释标签,其间的内容被视为注释的一部分

观察如下代码:

<!-- --a -->
     abc                 // 这里的内容将被视为注释的一部分
<!-- --b -->
注意:代码中红色部分,只要满足【(A)情况一】/【(B)情况二】中的出错条件即可。

以上代码在各浏览器下的表现如下表所示:

    Firefox(S)  IE6 IE7 IE8 Firefox(Q) Safari Chrome Opera
输出  无   abc
从上表可以看出,在两个出错的注释标签间的内容,将被视为注释的一部分而不予显示。

Firefox(S)下,以上代码相当于如下所示的代码,此时的情况在【(B)情况二】中已经讨论过。

<!-- -- a
     abc
-- b -->
解决方案
按标准推荐的方法写注释标签,如:

<!--  //此处 "<!" 和 "--" 之间尽量不要有空格。
这里是注释内容,应避免在注释内容中出现两个或以上的“-”字符。
-->  //此处 "--" 和 ">" 之间避免有空格。

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本:  IE6
IE7
IE8
Firefox 3.6.3
Chrome 5.0.375.9 dev
Safari 4.0.4
Opera 10.51
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值