正在写元素的自闭标签不传统上是空的坏习惯?

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

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

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

我假设你的问题是当你在Firefox中查看源代码时,自我closures元素上的红色尾部斜杠。 如果是这样的话,你已经陷入了最激烈的冲击之中,但同时也是浏览器制造商与networking开发者之间的战争的积极辩论。 XHTML不仅仅是一个文档的标记。 这也是关于文件是如何通过networking提供的。

在我开始之前 我正在努力不要在这里支持。

XHTML 1.1规范说,一个Web服务器应该为XHTML提供一个Content-Type的application / xhtml + xml。 Firefox会将这些尾部的斜杠标记为无效,因为您的文档是以text / html而不是application / xhtml + xml的forms提供的。 拿这两个例子来说吧。 相同的标记,一个作为application / xhtml + xml,另一个作为text / html。

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

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

Firefox将meta标签中的斜线标记为用text / html提供的文档无效,并对application / xhtml + xml提供的文档有效。

为什么这是有争议的

对于浏览器开发人员来说,XHT​​ML的重点在于你可以把你的文档当作XML来处理,这意味着如果有人给你发送了一些无效的东西,那么这个规范就说你不需要parsing它。 所以,如果一个文档被作为application / xhtml + xml提供,并且内容不完整,那么开发人员可以说“不是我的问题”。 你可以在这里看到

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

当文档以text / html的forms提供时,Firefox将其视为普通的旧HTML文档,并使用原谅,为您解决它,parsing例程

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

所以,对于一个浏览器制造商来说,XHT​​ML作为text / html是可笑的,因为它从来没有被浏览器的渲染引擎视为XML。

很多年前,Web开发人员不仅仅是标记猴子(声明:我把自己包括在其中)开始寻找开发不涉及三次嵌套表格的最佳实践的方法,但仍然允许一个引人入胜的devise经验。 他们/我们locking在XHTML / CSS上,因为W3C说这是未来,唯一的select是单个供应商(Microsoft)控制事实标记规范的世界。 真正的邪恶有单一的供应商 ,而不是微软。 我发誓。

那么争议在哪里? application / xhtml + xml有两个问题。 首先是Internet Explorer。 IE中有一个遗留缺陷/function,其中content / xhtml + xml将提示用户下载文档。 如果你试图访问IE浏览器上面列出的xhtml-as-xhtml.php,可能发生了什么事情。 这意味着如果你想使用application / xhtml + xml,你必须浏览器浏览IE浏览器 ,检查Accepts头并且只向那些接受它的浏览器提供application / xhtml + xml。 这听起来没有那么微不足道 ,也违背了networking开发者所追求的“一次写入”的原则。

第二个问题是XML的严酷性。 这又是一个火焰般的问题,但也有一些人认为一个错误的标签,或单一的字符编码不应该不会导致用户看不到他们想要的文件。 换句话说,是的,规范说,如果XML格式不正确,应该停止处理XML,但是用户不关心规范,他们关心的是他们的猫的网站被破坏了。

XHTML 1.0(不是1.1版)规范说,如果遵循某些兼容性指导原则 ,XHTML文档可能会以text / html的forms提供给用户。 像img标签自动closures之类的东西。 这里的关键词是可能的 。 在RFC中 ,可能意味着可选。 Firefox已经select不使用XHTML doctype处理文档,而是使用text / html的内容types作为XHTML。 但是,W3Cvalidation器会高兴地报告这些文件是有效的。

我会让读者去思考一个文件的同时出现的奇迹/恐怖,写一个文件来定义它可能的意思。

向前进

最后,这是整个HTML 5的东西。 XHTML成了这样一个政治热点,一群想要推动语言的人决定走向另一个方向。 他们为HTML 5制作了一个规范。目前这个规范正在W3C中被淘汰,预计在未来十年内完成。 与此同时,浏览器供应商正在从正在进行的规范中挑选和selectfunction并实施它们。

来自评论的更新

在评论中, 亚历克斯指出,如果你要嗅探的东西,你应该检查接受头来看看application / xhtml + xml是否被用户代理接受。

这是绝对正确的。 一般来说,如果你要嗅探,嗅探function,而不是浏览器。

除了其他的答案之外,在IE中,在标记中join<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内容。 那将是一个空的string,对吗? 不在IE中不会。 在IE中,你会在整个文档中获得所有的内容:

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

另外,第二个<p>出现在span的childNodes集合中。 同样的<p>也在body的childNodes集合中,这意味着一个节点可以有效地拥有多个父母 。 这对于依赖遍历DOM的脚本来说并不是什么好消息。

我也曾经对此发表过评论

是。 它是。 在某些情况下,旧的浏览器会造成问题。

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

在这种情况下,旧的浏览器可能不知道<script>标签已经结束。

作为application / xhtml + xml,<span />意味着创build一个没有内容的span元素。

作为文本/ html,<span />意味着创build一个span元素,其中元素的内容跟随此标签,直到遇到</ span>标签,或者遇到隐式closures元素的另一个标签(或EOF)。 即在这种情况下<span />的含义与<span>相同。

除此之外:HTML 5同时定义了HTML和XHTML序列化,所以不会以这种或那种方式影响这个问题。 像XHTML 1.1一样,它需要将XHTML作为application / xhtml + xml,而不像XHTML 1.0。 实际上,这并没有什么变化,因为所有的浏览器都把任何版本的XHTML作为text / html作为标签汤。

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

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

简而言之,如果您的XHTML将被视为XHTML,那就好了。 如果你打算假装它是HTML(如果你想让它通过Internet Explorer加载(包括本文写作时的最新版本),那么你需要做的就是跳转)。

箍是非常讨厌,我会build议大多数人坚持HTML 4.01。

一般来说,对空元素使用简写不是一个问题,但是在某些情况下会导致问题。

<script>是一个重要的,需要用</script>来closures以避免问题。

另外一个是<meta> ,它用蜘蛛写成<meta></meta>而不是<meta />

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

应该明确地说,HTML中没有自封闭的标签,所以无论浏览器什么时候决定把你的XHTML当成HTML,都不会意识到这个标签是closures的。 对于不需要用HTML封闭的标签(如<img> ,这并不是一个问题,但是像<span>这样的标签显然是不好的。