【问题标题】:Can comments appear before the DOCTYPE declaration?注释可以出现在 DOCTYPE 声明之前吗?
【发布时间】:2010-10-30 18:40:18
【问题描述】:

我想在我的 HTML 代码最顶部的 DOCTYPE 声明之前放置一个注释(<!-- this --> 样式)。这符合标准吗?主流浏览器都支持吗?这样做有什么陷阱吗?

【问题讨论】:

    标签: html comments doctype


    【解决方案1】:

    首先编写 <!DOCTYPE> 无疑是最佳实践。

    我记得很久很久以前的奇怪问题,一些浏览器(可能是 IE6)忽略了 <!DOCTYPE>,因为在它之前有一些看似无辜的东西 - 我认为只是空格,但也许它是一条评论。无论如何,这是一个非常可怕的错误,必须追查,而且肯定没有任何充分的理由在 <!DOCTYPE> 之前有 cmets 或空格。

    首先编写 <!DOCTYPE> 是,我想说,这只是有经验的 Web 开发人员为避免可怕的、难以捉摸的错误所做的事情。

    【讨论】:

    • 谢谢,我将把我的评论放在 html 标签之后。
    • 如果你想让它正常工作,它需要出现在包括 在内的所有内容之前。
    • 这只是咬我。我花了 4 个小时试图弄清楚为什么 IE7/8 渲染了所有内容。在检查每个标签是否有正确的右括号和东西之后,我创建了一个新文件并逐行复制代码(不是 cmets),一切正常。完全困惑,我胡乱地想“如果……怎么办?”当我注意到原始文件中 DOCTYPE 之前的注释行时。有我的罪魁祸首!
    • 这个问题在 IE10 中得到解决。 Doctype 之前的 cmets 不会强制 IE10 进入 quirks 模式。
    • 关于使用 CKEditor,以防万一这对某人有帮助,我还花了几个小时试图弄清楚为什么 CKEditor UI 没有出现 IE7、IE8 或 IE9,但在其他浏览器中工作正常。原来它只是出现在 DOCTYPE 行之前的 HTML 注释。诅咒你,IE!
    【解决方案2】:

    这样做是完全有效

    <!-- this, -->
    <!DOCTYPE html>
    

    然而,它会将所有版本的 IE 带入 quirks-mode(除非它被强制 -quirks 模式 - 请参阅下面的 Gotchas 部分)。最简单的就是将注释移到 DOCTYPE 下面。

    <!DOCTYPE html>
    <!-- this, -->
    

    但另一种方法是将评论“升级”合适的条件评论,例如:

    <!--[if !IE]> this <![endif]-->
    <!DOCTYPE html>
    

    说明:在 IE 的世界中,条件评论不作为评论。

    替代语法:要忘记/记住条件 cmets 是 Microsoft 对 HTML 标准的入侵,例如可以这样做

    <!--[if anybrowser]> this <![endif]-->
    <!DOCTYPE html>
    

    同样,要特别针对 IE,可以这样做

    <!--[if !anybrowser]> this <![endif]-->
    <!DOCTYPE html>
    

    陷阱

    评论inside条件评论将使 IE 进入怪癖模式如果 IE 看​​到它(即:如果使用 [if IE] 条件,或与 [if IE] 等效的条件,例如我上面提到的 [if !anybrowser] 条件。)。因此,例如,这会使 IE 进入 quirks-mode:

    <![if IE]><!-- this --><![endif]>
    <!DOCTYPE html>
    

    会的

    <!--[if IE]><!--><!-- this <![endif]-->
    <!DOCTYPE html>
    

    和许多其他变体。而例如

    <!--[if IE]><!DOCTYPE html><!--><!-- this <![endif]-->
    <!DOCTYPE html>
    

    不会导致怪癖模式,因为here条件注释在任何其他内容之前有一个DOCTYPE ,因此 IE 认为页面的第一个内容是 DOCTYPE。

    最后,最新的 IE 版本,IE8 和 IE9,可以通过使用另一个 Microsoft 来强制进入标准模式(以及怪癖模式)发明 - x-ua-compatible 指令。见http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx的话,那么

    <!-- this -->
    <!DOCTYPE html>
    <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=8" ><![endif]-->
    

    强制 IE8 和 IE9 进入 no-quirks 模式,而 IE6 和 IE7 将保持 quirks 模式。而相比之下,这个

    <!--[if gte IE 8]><meta http-equiv="X-UA-Compatible" content="IE=8" ><![endif]-->
    <!DOCTYPE html>
    

    强制 IE8 和 IE9 进入标准模式,尽管条件注释的内容以 DOCTYPE 开头。并且 IE6 和 IE7 也将保持在 no-quirks 模式,因为条件注释不针对它们。

    【讨论】:

    • 我很久以前就决定通过将我的顶级评论放在 DOCTYPE 之后来避免整个问题,但感谢您对 IE 行为的详细(和引人入胜的)解释。
    • A+ :) 我会相信你的话 - 这是一个非常详细的回复 - 谢谢,我非常喜欢它。你显然没有在兔子洞面前停下来:
    【解决方案3】:

    允许在 doctype 之前添加注释,但会导致 所有 IE 版本恢复到 quirks 模式。实际上,它们有时用于此目的。 XML 声明 (&lt;?xml version ...?&gt;) 具有相同的效果,在 IE6 及以下中。

    【讨论】:

      【解决方案4】:

      根据this page,这可能会导致 IE7 以怪异模式呈现,就好像文档类型根本不存在一样。

      【讨论】:

        【解决方案5】:

        虽然按照我认为的标准这是可以接受的,但你肯定想避免它,因为它会使 IE 进入怪癖模式。

        (见Triggering different rendering modes

        【讨论】:

        • 除 DOCTYPE 前面的空白之外的任何内容都会将 IE(至少 6 和 7,不确定 8)抛出到怪癖模式。
        猜你喜欢
        • 2010-11-14
        • 2015-07-15
        • 2015-07-03
        • 1970-01-01
        • 2019-05-26
        • 2019-03-23
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多