为什么在XHTML中,<br />和<br></br>不同?

4

以下是完整的HTML页面源代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head></head>
<body>
one<br>
two<br />
three<br></br>
four    
</body>
</html>

有人能解释一下为什么在IE8或Chrome中查看页面时,“三”和“四”之间会出现额外的空白行吗?

我认为标准应该让所有浏览器看起来都一样,据我所见,此页面符合XHTML过渡标准。

6个回答

8

因为HTML兼容性指南规定br标签应该是自闭合的。显然,Chrome和IE8没有遵循规范,而是帮你关闭了未关闭的标签,从而创建了第二个换行符。


XHTML规范不要求任何元素是自闭合的。这是HTML兼容性指南。 - Quentin
哇,谢谢 - 我一直以为XHTML规定br标签必须是自闭合的呢。 - Rob Stevenson-Leggett
Chrome和IE8都遵循规范-HTML规范。这就是假装XHTML是HTML的问题所在。 - Quentin
感谢Alohci和您提供的帮助。我真的很惊讶能找到这个,但也有点震惊,即使是最新的标准也有这样的遗留问题。我的HTML之所以会出现这种情况,是因为我正在使用ASP.NET在控件树中创建一个“br”元素,这似乎是完全合理的事情。但现在我只能创建一个包含文本“<br>”的文本节点 - 这太糟糕了 :-( - Andy
我会使用一个Literal并将文本设置为<br/>,这可能是最简洁的方式。 - Rob Stevenson-Leggett

8
一些好的答案已经给出,但是要指出的是HTML5实际上指定在解析为text/html时<br></br>应被解析为两个<br>开始标签。
请参阅http://dev.w3.org/html5/spec/tokenization.html#parsing-main-inbody中的“结束标记名称为“br”的结束标记”。
Firefox 3.x只在quirks模式下执行此操作,但Firefox 4在标准模式下也会这样做。

+1 对于引用的支持。然而...“标签名为“br”的结束标签:解析错误。假装看到了一个标签名为“br”的开始标记令牌。忽略结束标记令牌。”-- 我的理解不太一样 :-/ - user166390
+1 同意。@pst 意思是“将 </br> 替换为 <br></br>,然后丢弃 </br>”,这基本上意味着“将 </br> 解释为 <br>”。因此,HTML 代码 <br></br> 必须 解释为 <br><br> - Matty K

5
尽管这是有效的代码,但这是非常不寻常的。更有可能的情况是开发人员错误地使用<br></br>,而实际上他们想要使用的是<br/>。因此,大多数浏览器都将两者解释为<br/>

我不理解“因此”的部分。最合乎逻辑的是</br>会被简单地忽略掉。(但浏览器真的合理吗?) - user166390
浏览器的工作不是遵循标准,而是显示网页。通常这些网页会有错误,一个打破规则以处理这些错误而不是失败的浏览器在我看来是更好的浏览器。 - fredley
我不能同意。不幸的是,这种想法导致了我们刚开始摆脱的“混乱”。如果<br>确实是BR,那么任何</br>都可以/将会被忽略--例如,BR的只是开放标签(元素内容无关)。我有点失望这种情况在HTML5中被忽略了。 - user166390
有趣的观点,但我认为在这种情况下,任何人使用<br></br>的机会是如此之小(与某人错误地使用它的机会相比),以至于你将更多的人解释为单个<br/>而不是两个。 - fredley
任何人手动编写2个单独的标签的可能性很低,但是(请参见我的上面的注释),我正在使用asp.net在控件树中生成br元素。我想你可以认为这是asp.net中的一个错误,但由于将有越来越多的人使用XML工具来生成XHTML网页,所以在这种情况下,我绝对支持pst的观点。 - Andy

3
在三和四之间多出的一行是因为它们之间有两个<br />标签。第一个标签将内容移动到下一行,第二个标签再将其向下移动一行。这是预期的行为。 编辑 抱歉,我以为需要严格按照格式要求返回结果。
此外,<br />标签是空标签,因此必须关闭。因此,我认为<br>在技术上不符合xhtml标准。应该使用<br />

它在技术上符合XHTML标准。 - Quentin
@David Dorward,正如我在编辑中所说的,我正在考虑strict。请到这里并尝试基于xhtml strict验证此内容(必须在body标记中):<p><br></p> - Richard Marskell - Drackir

1

I.E 看起来将
和 两者都解释为“换行符”,并为每个添加一个换行符。


1

在XHTML中,它们是相同的,如果您将文档作为application/xhtml+xml提供,则在浏览器中没有区别(假设浏览器支持XHTML,IE 8及以下版本不支持)。

如果您将文档作为text/html提供,则将被视为HTML而不是XHTML,在HTML中,<br>是一个元素,其中结束标记是禁止的。如果您包含显式的结束标记,则某些浏览器将错误更正以假定</br><br> 开始标记。

如果您声称您的XHTML是text/html,则必须遵循各种其他规则。这些规则在兼容性指南中有描述。这个特定的规则是关于永远不能有内容的元素

在过渡到XHTML正式版期间,作为text/html服务是一项旨在短期内解决问题的黑客。许多因素(包括来自Microsoft的支持不足)阻止了这一转变的完成,而HTML 5运动已经放弃了这个想法,回到了可选和禁止的结束标签上(但添加了/>作为语法糖)。

我在这种情况下从本地文件加载文档,但我尝试添加头行<meta http-equiv="Content-Type" content="application/xhtml+xml"/>似乎没有任何区别。 - Andy
处理本地文件时,浏览器往往关注文件扩展名。.html.xhtml的区别。浏览器从不关心在meta http-equiv中指定的媒体类型(它们有时会关心字符集,但从不关心媒体类型)。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接