是否为传统上不是坏习惯的元素编写自闭标签?

时间:2008-12-08 05:33:34

标签: xml html5 xhtml

我注意到jQuery(或者它是Firefox)会转换我的<span class="presentational"></span> into <span class="presentational" />

现在我的问题是,写这样的标记是否可以?任何浏览器都会窒息吗?

就我个人而言,如果<span class="presentational" />为空,我觉得它看起来更干净。

8 个答案:

答案 0 :(得分:110)

当您在Firefox中查看源代码时,我假设您的问题与自闭元素上的红色尾部斜杠有关。如果是这样的话,你就会陷入最强烈的冲击之中,同时在浏览器制造商与网络开发者大战中同时进行被动的激进辩论。 XHTML不只是关于文档的标记。它还涉及如何通过网络提供文档。

在我开始之前;我正努力不要偏袒任何一方。

XHTML 1.1规范说Web服务器应该使用Content-Type of application / xhtml + xml来提供XHTML。 Firefox将这些尾随斜杠单独列为无效,因为您的文档以text / html而非application / xhtml + xml的形式提供。拿这两个例子;相同的标记,一个用作application / xhtml + xml,另一个用作text / html。

http://alanstorm.com/testbed/xhtml-as-html.php

http://alanstorm.com/testbed/xhtml-as-xhtml.php

Firefox将元标记中的尾部斜杠标记为使用text / html提供的文档无效,并且对于使用application / xhtml + xml提供的文档有效。

为什么这是有争议的

对于浏览器开发人员来说,XHT​​ML的重点是您可以将文档视为XML,这意味着如果有人向您发送了无效的内容,则规范说您不必解析它。因此,如果文档作为application / xhtml + xml提供并且内容不完整,则允许开发人员说“不是我的问题”。你可以看到这里的行动

http://alanstorm.com/testbed/xhtml-not-valid.php

当文档作为text / html提供时,Firefox将其视为普通的旧HTML文档并使用宽容,为您修复,解析例程

http://alanstorm.com/testbed/xhtml-not-valid-as-html.php

因此,对于浏览器制造商而言,作为text / html的XHTML是荒谬的,因为它从未被浏览器的渲染引擎视为XML。

多年前,网络开发人员希望不只是标记猴子(免责声明:我将自己列为其中之一)开始寻找方法来开发不涉及三次嵌套表的最佳实践,但仍然允许引人注目的设计经验。他们/我们锁定了XHTML / CSS,因为W3C说这是未来,唯一的另一个选择是一个单一供应商(微软)控制事实上的标记规范的世界。真正的邪恶是单一供应商,而不是微软。我发誓。

那么争议在哪里? application / xhtml + xml有两个问题。第一个是Internet Explorer。 IE中存在遗留错误/功能,其中作为application / xhtml + xml的内容将提示用户下载文档。如果您尝试使用IE浏览上面列出的xhtml-as-xhtml.php,那很可能发生了什么。这意味着如果你想使用application / xhtml + xml,你必须浏览器嗅探IE ,检查Accepts头,只向那些接受它的浏览器提供application / xhtml + xml。这是not as trivial,因为它听起来是正确的,也违背了网络开发人员正在努力的“一次写入”原则。

第二个问题是XML的严酷性。这又是一个易受火焰影响的问题之一,但是有些人认为单个不良标记或单个字符编码不正确不应导致用户看不到他们想要的文档。换句话说,是的,规范说你应该停止处理XML,如果它没有很好地形成,但用户不关心规范,他们关心他们的猫的网站是坏的。

为此问题添加更多汽油是XHTML 1.0(不是1.1)规范说XHTML文档可能作为text / html提供,假设遵循某些compatibility guidelines。 img标签就是自动关闭之类的东西。这里的关键词是 may 。在RFC speak中,可能意味着可选。 Firefox选择不处理使用XHTML doctype但内容类型为text / html的文档作为XHTML。但是,W3C验证器会很乐意将这些文档报告为有效。

我会让读者思考一种文化的同时奇迹/恐怖,这种文化会写一份文件来定义可能这个词的含义。

前进

最后,这就是整个HTML 5的内容。 XHTML成为一个政治上的烫手山芋,一群想要推动语言向前发展的人决定走向另一个方向。他们为HTML 5制作了一个规范。目前W3C正在进行这项规范,预计将在未来十年内完成。与此同时,浏览器供应商正在从正在进行的规范中挑选和选择功能并实施它们。

评论的更新

在评论中,Alex指出,如果您要嗅探某些内容,则应检查Accept标头,以查看用户代理是否接受application / xhtml + xml。

这是绝对正确的。一般情况下,如果您要嗅闻,请嗅探该功能,而不是浏览器。

答案 1 :(得分:19)

对其他答案的补充:在IE中,在标记中包含<span />等元素会导致JavaScript中的DOM遍历方法出现各种问题。看看下面的XHTML文档:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Test</title>
    <script type="text/javascript">
        function show() {
            var span = document.getElementById("span");
            alert(span.innerHTML);
        }
    </script>
</head>
<body onload="show();">
<p id="p1">Paragraph containing some text followed by
           an empty span<span id="span"/></p>
<p id="p2">Second paragraph just containing text</p>
</body>
</html>

这个想法是,当页面加载时,JavaScript将获得对空跨度的引用并显示其HTML内容。那将是一个空字符串,对吧?不在IE中它不会。在IE中,您可以获得整个文档中跨度之后的所有内容:

</P>
<P id=p2>Second paragraph just containing text</P>

此外,第二个<p>显示在范围的childNodes集合中。同样<p>也在正文的childNodes集合中,这意味着一个节点可以有效地拥有多个父母。对于依赖于遍历DOM的脚本来说,这不是一个非常好的消息。

我还有blogged about this

答案 2 :(得分:10)

是。它是。对于旧版浏览器,它会在某些情况下导致问题。

<script type='text/javascript' src='script.js' />

在这种情况下,旧浏览器可能无法理解<script>标记已结束。

答案 3 :(得分:3)

作为application / xhtml + xml,&lt; span /&gt;意味着创建一个没有内容的span元素。

作为text / html投放,&lt; span /&gt;表示创建一个span元素,其中元素的内容遵循此标记,直到&lt; / span&gt;遇到标记,或遇到隐式关闭元素的其他标记(或EOF)。即在这种情况下&lt; span /&gt;与&lt; span&gt;相同。

除此之外:HTML 5定义了HTML和XHTML序列化,因此它不会以某种方式影响此问题。与XHTML 1.1一样,它确实需要将XHTML作为application / xhtml + xml提供,与XHTML 1.0不同。实际上,这并没有改变,因为所有浏览器都将任何版本的XHTML视为text / html作为标记汤。

答案 4 :(得分:2)

请参阅XHMTL工作组的主题说明:http://www.w3.org/TR/xhtml-media-types/

简而言之 - 如果您的XHTML将被视为XHTML,那就没问题了。如果您打算假装它是HTML(如果您希望它由Internet Explorer加载(包括版本8,在撰写本文时最新版本),则需要执行此操作,那么您必须跳过箍)。

箍很烦人,我建议大多数人坚持使用HTML 4.01。

答案 5 :(得分:2)

另外值得注意的是,在doctype之前的<?xml ...?>声明会将IE引入怪癖模式。

答案 6 :(得分:0)

一般来说,对空元素使用简写并不是一个问题,但是有一些例外,它可能会导致问题。

<script>是一个重要的问题,需要</script>关闭才能避免问题。

另一个是<meta>,对于编写为<meta></meta>而不是<meta />

的蜘蛛,效果更好

不完全是问题,但在格式方面相关,IE的版本只有<div></div><div />等空元素存在问题。在这种情况下,需要<div>&nbsp;</div>来维护格式。

答案 7 :(得分:0)

应该明确地说HTML中没有自闭标记,因此每当浏览器决定将您的XHTML视为HTML时,它就不会识别标记是否已关闭。对于不必在HTML中关闭的代码(例如<img>),这不是问题,但对于<span>这样的代码显然不好。