如何防止 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,以便它们在浏览器处于标准模式时按您的意愿工作。