【问题标题】:Does the HTML5 spec say to ignore CSS inside HTML comments?HTML5 规范是否规定忽略 HTML 注释中的 CSS?
【发布时间】:2017-04-06 10:42:07
【问题描述】:

谁能告诉我 HTML5 规范中的以下段落是什么意思?关于<style>元素内容的处理:

https://www.w3.org/TR/html5/document-metadata.html#the-style-element

必须处理所有后代元素,根据它们的 语义,在样式元素本身被评估之前。用于造型 由纯文本(相对于 XML)、用户代理组成的语言 必须通过传递 作为样式元素的子节点的所有文本节点的内容 (不是任何其他节点,例如 cmets 或元素),按树形顺序, 风格系统。对于基于 XML 的样式语言,用户代理必须 将样式元素的所有子节点传递给样式系统。

在我看来,这听起来像是 HTML 解析器应该在将结果文本发送到样式系统之前删除 <style> 元素内的所有 HTML 元素和 cmets。

HTML 注释中的内容也是一个文本节点,但它不是样式元素的直接子元素,因此不应包含在发送到样式系统的文本中。

现代浏览器似乎没有对样式元素中的 cmets 或元素进行任何处理,而是将样式内容视为与 HTML 4 一致的 CDATA。但是 HTML5 规范中的这一段说这是不正确的行为,不是吗?如果不是,我错过了什么?

【问题讨论】:

    标签: css html html-parsing specifications


    【解决方案1】:

    将注释节点或元素节点放入style 元素的唯一方法是通过DOM 操作——在HTML 解析器已经解析文档之后将注释或元素放入DOM 中的style 元素中。

    所以规范并不是说 HTML 解析器应该删除 <style>…</style> 标记中的所有 HTML 元素和 cmets。如果规范打算明确说明。

    HTML 解析器将 <style>…</style> 标记中的所有内容解析为文本,包括任何看起来像评论或看起来像元素的内容。

    因此,这里没有可供 HTML 解析器删除的 cmets 或元素——它们都只是文本。

    规范在哪里说内容是纯文本?

    html.spec.whatwg.org/multipage/syntax.html#raw-text-elementsstyle 内容是“原始文本”。

    HTML 4 规范明确指出样式元素的内容是 CDATA。这就是我正在寻找的,但我在 HTML5 规范中找不到它。

    当前 HTML 规范所称的“原始文本”与 HTML4 规范中的 CDATA 基本相同。

    它在哪里说它是由字符串“</style”终止的?

    看解析算法的这些步骤:

    1. https://html.spec.whatwg.org/multipage/syntax.html#rawtext-state
    2. https://html.spec.whatwg.org/multipage/syntax.html#rawtext-less-than-sign-state
    3. https://html.spec.whatwg.org/multipage/syntax.html#rawtext-end-tag-open-state
    4. https://html.spec.whatwg.org/multipage/syntax.html#rawtext-end-tag-name-state

    最后一步引用the definition of “appropriate end tag token”:

    适当的结束标记标记是结束标记标记,其标记名称与要从此标记器发出的最后一个开始标记的标记名称匹配(如果有)。

    因此,在解析script 内容的原始文本时,发出的最后一个开始标记是<script> 开始标记,因此“适当的结束标记标记”是</script>

    【讨论】:

    • 您声明“HTML 解析器将 标记中的所有内容解析为文本——包括任何看起来像评论或看起来像元素的内容”。规范在哪里说内容是纯文本?它在哪里说它是由字符串“”终止的? HTML 4 规范明确指出样式元素的内容是 CDATA。这就是我正在寻找的,但我在 HTML5 规范中找不到它。