可以在DOCTYPE声明之前出现评论吗?

Tra*_*ale 56 html doctype comments

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

Kom*_*ist 132

这是完全有效的

<!-- this, -->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

但是,它将所有版本的IE带入了quirks-mode(除非它被强制进入非怪癖模式 - 请参阅下面的" 陷阱"部分).最简单的是将注释移到DOCTYPE下面.

<!DOCTYPE html>
<!-- this, -->
Run Code Online (Sandbox Code Playgroud)

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

<!--[if !IE]> this <![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

说明:一个有条件的评论不为注释,在IE的天下.

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

<!--[if anybrowser]> this <![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

同样,特别是针对IE,可以做到

<!--[if !anybrowser]> this <![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

陷阱

注释内部条件注释会带来IE到怪癖模式如果IE看到它(即:如果一个使用了[如果IE]条件,或等效为[如果IE] -如[!如果anybrowser]条件是我上面提到过.)因此,例如,这将使IE处于怪癖模式:

<![if IE]><!-- this --><![endif]>
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

就像那样

<!--[if IE]><!--><!-- this <![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

和许多其他变种.例如,

<!--[if IE]><!DOCTYPE html><!--><!-- this <![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

不会造成怪癖模式,因为这里的条件注释有一个DOCTYPE 之前任何其他内容,因此IE认为页面的第一个内容是DOCTYPE.

最后,最新的IE版本IE8和IE9可以通过使用另一个微软发明 - x-ua兼容指令强制进入标准模式(以及quirks模式).请参阅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]-->
Run Code Online (Sandbox Code Playgroud)

迫使 IE8和IE9进入无怪癖模式,而IE6和IE7将保持怪异模式.而相反,这一点

<!--[if gte IE 8]><meta http-equiv="X-UA-Compatible" content="IE=8" ><![endif]-->
<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

尽管条件评论的内容不是以DOCTYPE开头, IE8和IE9 会强制进入标准模式.IE6和IE7也将保持非怪癖模式,因为条件评论不针对它们.

  • 我很久以前决定通过在DOCTYPE之后发表我的最高评论来避免整个问题,但感谢IE的行为的详细(和迷人)解释. (5认同)
  • A + :)我会接受你的话 - 这是一个令人难以置信的详细回复 - 谢谢,我非常喜欢它.你显然没有停止面对rabbithole: (2认同)

Tri*_*ych 38

写第<!DOCTYPE>一个肯定是最好的做法.

我很久很久以前就记得奇怪的问题了,有些浏览器(可能是IE6)忽略了a,<!DOCTYPE>因为之前有些看似无辜的东西 - 我想只是空白,但也许是评论.在任何情况下,这都是一个可怕的,可怕的错误,必须追查,并且肯定没有任何充分的理由在之前有评论或空白<!DOCTYPE>.

<!DOCTYPE>我要说的是,写第一个是经验丰富的Web开发人员为避免可怕的,难以捉摸的错误所做的事情.

  • 这只是我的意思.我花了4个小时试图找出为什么IE7/8渲染了一切的地方.检查每个标签是否正确关闭括号和内容后,我创建了一个新文件并逐行复制代码(而不是注释),一切正常.完全不知所措,我随意想"怎么......?" 当我在原始文件中注意到DOCTYPE之前的注释行时.有我的罪魁祸首! (8认同)
  • 此问题已在IE10中得到解决.Doctype之前的注释不会强制IE10进行怪异模式. (6认同)

jve*_*ema 12

虽然按照我认为的标准是可以接受的,但你绝对想避免它,因为它会让IE进入怪癖模式.

(请参阅触发不同的渲染模式)

  • 除了DOCTYPE之前的空白之外的任何东西都会将IE(6和7,至少 - 不确定8)抛入怪癖模式. (4认同)