【发布时间】:2010-10-30 18:40:18
【问题描述】:
我想在我的 HTML 代码最顶部的 DOCTYPE 声明之前放置一个注释(<!-- this --> 样式)。这符合标准吗?主流浏览器都支持吗?这样做有什么陷阱吗?
【问题讨论】:
我想在我的 HTML 代码最顶部的 DOCTYPE 声明之前放置一个注释(<!-- this --> 样式)。这符合标准吗?主流浏览器都支持吗?这样做有什么陷阱吗?
【问题讨论】:
首先编写 <!DOCTYPE> 无疑是最佳实践。
我记得很久很久以前的奇怪问题,一些浏览器(可能是 IE6)忽略了 <!DOCTYPE>,因为在它之前有一些看似无辜的东西 - 我认为只是空格,但也许它是一条评论。无论如何,这是一个非常可怕的错误,必须追查,而且肯定没有任何充分的理由在 <!DOCTYPE> 之前有 cmets 或空格。
首先编写 <!DOCTYPE> 是,我想说,这只是有经验的 Web 开发人员为避免可怕的、难以捉摸的错误所做的事情。
【讨论】:
这样做是完全有效
<!-- 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 版本恢复到 quirks 模式。实际上,它们有时用于此目的。 XML 声明 (<?xml version ...?>) 具有相同的效果,在 IE6 及以下中。
【讨论】:
根据this page,这可能会导致 IE7 以怪异模式呈现,就好像文档类型根本不存在一样。
【讨论】:
虽然按照我认为的标准这是可以接受的,但你肯定想避免它,因为它会使 IE 进入怪癖模式。
【讨论】: