如何防止 Perl CGI->start_html() 打印 DOCTYPE header
How to prevent Perl CGI->start_html() from printing DOCTYPE header
当使用 Perl CGI 时,它总是打印出:<"DOCTYPE html ".... > header 在打印出剩余的 html body,这会扰乱网页的正常显示。我猜原因是 DOCTYPE 仍然引用了 HTML 的一个非常旧的版本。无论我何时使用 $query->start_html(...);,都会生成第一行。所以问题是,如何防止生成 行?当我删除该 DOCTYPE 行时,我的网页会在此之后正常运行。非常感谢任何见解。谢谢!
浏览器将使用 DOCTYPE
定义来决定是否在 Quirks mode 中解释 HTML(或 XHTML)文档。我假设这就是您所说的“扰乱网页的正确显示”的意思 - 您正在仔细创建有效的 HTML5 但浏览器进入怪癖模式并且页面看起来不正确。
你要的是标准的HTMLDOCTYPE
定义。
<!DOCTYPE html>
不幸的是,CGI.pm 中的 HTML 生成函数无人维护,不支持 HTML5。所以你不能让模块生成这个 DOCTYPE
.
老实说,最好的方法是停止使用所有 HTML 生成函数,转而使用 template-based 方法。但我知道这将是一项艰巨的工作,所以在短期内,也许您可以停止使用 start_html()
。用包含所需文本的 heredoc 替换调用应该不会太难。
更新: 下面 Quentin 的评论让我开始思考。当我说:
you're carefully creating valid HTML5 but the browser goes into Quirks mode and the page doesn't look right
我完全错了。如果你得到了你想要的 而没有 和 DOCTYPE
的浏览器行为,那么你想将浏览器置于 Quirks 模式。这要容易得多。使用我上面链接的维基百科文章中的信息,您可以看到 HTML 4.01 Transitional 是最新的 DOCTYPE
,它将所有现代浏览器置于 Quirks 模式。所以你可以使用 DOCTYPE
.
$ perl -MCGI=:html -E'say start_html(-dtd => "-//W3C//DTD HTML 4.01 Transitional//EN")'
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Untitled Document</title>
</head>
<body>
这应该能让浏览器按您希望的方式工作。
但依赖 Quirks 模式是脆弱的。我建议您考虑修复 HTML 和 CSS,以便它们在浏览器处于标准模式时按您的意愿工作。
当使用 Perl CGI 时,它总是打印出:<"DOCTYPE html ".... > header 在打印出剩余的 html body,这会扰乱网页的正常显示。我猜原因是 DOCTYPE 仍然引用了 HTML 的一个非常旧的版本。无论我何时使用 $query->start_html(...);,都会生成第一行。所以问题是,如何防止生成 行?当我删除该 DOCTYPE 行时,我的网页会在此之后正常运行。非常感谢任何见解。谢谢!
浏览器将使用 DOCTYPE
定义来决定是否在 Quirks mode 中解释 HTML(或 XHTML)文档。我假设这就是您所说的“扰乱网页的正确显示”的意思 - 您正在仔细创建有效的 HTML5 但浏览器进入怪癖模式并且页面看起来不正确。
你要的是标准的HTMLDOCTYPE
定义。
<!DOCTYPE html>
不幸的是,CGI.pm 中的 HTML 生成函数无人维护,不支持 HTML5。所以你不能让模块生成这个 DOCTYPE
.
老实说,最好的方法是停止使用所有 HTML 生成函数,转而使用 template-based 方法。但我知道这将是一项艰巨的工作,所以在短期内,也许您可以停止使用 start_html()
。用包含所需文本的 heredoc 替换调用应该不会太难。
更新: 下面 Quentin 的评论让我开始思考。当我说:
you're carefully creating valid HTML5 but the browser goes into Quirks mode and the page doesn't look right
我完全错了。如果你得到了你想要的 而没有 和 DOCTYPE
的浏览器行为,那么你想将浏览器置于 Quirks 模式。这要容易得多。使用我上面链接的维基百科文章中的信息,您可以看到 HTML 4.01 Transitional 是最新的 DOCTYPE
,它将所有现代浏览器置于 Quirks 模式。所以你可以使用 DOCTYPE
.
$ perl -MCGI=:html -E'say start_html(-dtd => "-//W3C//DTD HTML 4.01 Transitional//EN")'
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Untitled Document</title>
</head>
<body>
这应该能让浏览器按您希望的方式工作。
但依赖 Quirks 模式是脆弱的。我建议您考虑修复 HTML 和 CSS,以便它们在浏览器处于标准模式时按您的意愿工作。