如何更改DOCTYPE声明

15

有人知道怎么使用JavaScript动态更改文档类型吗?

我已经尝试了这个函数:

document.doctype('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">'); ,

但它不起作用。


1
只是好奇,你为什么想要这样做? - Ben Everard
1
即使你可以这样做,你期望它会产生什么效果呢?如果我没记错的话,浏览器只在解析页面时考虑文档类型声明一次。 - Piskvor left the building
2
根据https://developer.mozilla.org/en/DOM/document.doctype和http://www.devguru.com/technologies/xmldom/quickref/document_doctype.html,此处为只读。 - JoseK
1
真正的原因是,我创建的设计在不同的浏览器中会出现混乱,我发现通过在不同的浏览器中使用不同的文档类型,页面看起来又可以了。 - mana
1
Mana,与其测试每种可能的Doctype或试图即时更改它(这是不可能的,或者不会有任何区别),不如提出关于您实际遇到的问题的问题(包括源代码的相关部分和最好是有问题的示例页面的链接),这样我们就可以修复它们,而不是有条件地选择浏览器模式,这不是一个好主意(始终(尝试)使用标准模式)。顺便说一下,请阅读使用Doctype激活浏览器模式 - Marcel Korpel
显示剩余4条评论
6个回答

15

我希望这个能对你们中的一些人有所帮助(已在控制台中测试,它可以改变实际的 DOCTYPE)

var newDoctype = document.implementation.createDocumentType(
 'html',
 '-//W3C//DTD XHTML 1.0 Transitional//EN',
 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdd'
);

document.doctype.parentNode.replaceChild(newDoctype,document.doctype);

2
document.implementation.createDocumentType()在IE8中不可用,而我目前需要在那里使用它,这真是令人遗憾。 - flyingace
尝试一下这个 https://dev59.com/bmsy5IYBdhLWcg3w6yUN - Akash Saikia
@AkashSaikia Saikia,将这个脚本放在window.load还是document.ready里面更好呢?应该是放在window.load里面吧? - Jim22150
1
@Jim22150 是的,在尝试访问文档对象的任何部分之前,等待实际DOM加载完成会更好。 - Akash Saikia
1
它只会在检查器选项卡中更改文档类型的文本,但如果您将文档类型从html4更改为html5或从xhtml更改为html,则仍会按照旧的文档类型进行操作。在Firefox 51中进行了测试。 - Owyn
显示剩余2条评论

3
为了说明这个用例,我有以下场景:
我有一个TAL模板,用于渲染页面的一小部分。然后我将该部分包装在父标签中,如下所示:
<html tal:omit-tag="True" ...>
  <body tal:omit-tag="True">
    <div class="wrapper" tal:omit-tag="True">
      ..

        <div id="mydiv" tal:content="foo()">Example content.</div>

      ..
    </div>
  </body>
</html>

这样,设计师可以将这个TAL模板视为一个独立的HTML文件进行查看和编辑。在TAL中不能省略DTD,因此无法在其中添加。

使用JavaScript添加它的简单方法如下:

if (!document.doctype) {
    document.write('<!doctype HTML>\n' + \
        document.head.outerHTML + \
        document.body.outerHTML);
}

3

“createDocumentType”虽然是编程中的一个方法,但并非所有浏览器都支持。例如,Chromium浏览器就不支持该方法。 - Attila O.
2013年3月30日:Chromium有它,IE9+也有。 - Adrian Maire

1

我认为你做不到。在W3C文档中,doctype被列为一个属性,但它是只读的。即使它不是只读的,我也无法想象在现实世界的浏览器中更改它会产生什么影响。

关于您后续的评论:您必须在服务器端处理此问题,并返回适合目标浏览器的页面。但在除了一些非常边缘的情况之外,您不应该这样做。


2
关于你最后一句话(“他们只是根据是否有文档类型声明来标记怪异模式,而不是文档类型声明的内容”):那不是真的。几个文档类型声明会触发怪异模式,比如OP在他的评论中提到的HTML 3.2版本。请参见使用文档类型声明激活浏览器模式 - Marcel Korpel
@Marcel:非常有趣。我已经看到了这个说法“只要有 DOCTYPE,就没关系”很多次了,我很惊讶之前没有看到它被反驳过。非常有趣的表格,谢谢。你也可以看出为什么 3.2 会是怪异模式。我已经删除了那句话,再次感谢。 - T.J. Crowder

0
如果问题只出现在IE浏览器上,我也遇到了同样的问题,我使用了IE的怪异模式 - 只需在DOC TYPE声明之前添加注释,IE就会进入怪异模式。
另一种解决方法是先加载一个脚本来检测浏览器,然后使用浏览器参数重定向到另一个页面,在那里您可以声明依赖于浏览器的文档类型。
我所做的代码示例类似于:-
<!--[if lt IE 9]>
<![endif]-->
<![if gte IE 9]>
<!DOCTYPE html>
<![endif]>

这里我已经从浏览器中删除了文档类型声明


0
即使你可以修改DOCTYPE,但在页面已决定渲染后执行代码的情况下,更改DOCTYPE的效果也是无关紧要的。我能想象到现代浏览器出现DOCTYPE问题的唯一方式是你依赖IE中的怪异模式——修正设计以适用于除IE之外的所有浏览器,然后再着手处理IE特定的样式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接