使用 Javascript 以字符串形式获取 HTML 的 DocType

IT技术 javascript dom
2021-01-31 01:46:16

我知道我可以通过document.doctypeor访问 doctype 对象,document.childNodes[0]但我的问题是将 doctype 作为字符串获取。我可以在 chrome 和 safari 中通过调用document.doctypewhich 返回来做到这一点<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">但是在 Firefox 中,调用document.doctype返回 DocumentType 对象。

有没有办法像在 chrome 和 safari 中一样在所有浏览器中获取 doctype 字符串?

谢谢!

5个回答

在所有兼容的浏览器(包括 Chrome/Safari)中,document.doctype也返回一个DocumentType对象。以下代码可用于生成有效的 DOCTYPE 字符串。

var node = document.doctype;
var html = "<!DOCTYPE "
         + node.name
         + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '')
         + (!node.publicId && node.systemId ? ' SYSTEM' : '') 
         + (node.systemId ? ' "' + node.systemId + '"' : '')
         + '>';

此方法返回有效 (HTML5) doctypes的正确字符串,例如:

  • <!DOCTYPE html>
  • <!DOCTYPE html SYSTEM "about:legacy-compat">
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

代码说明:

node.name      # Holds the name of the root element, eg: HTML / html
node.publicId  # If this property is present, then it's a public document type.
               #>Prefix PUBLIC
!node.publicId && node.systemId
               # If there's no publicId, but a systemId, prefix SYSTEM
node.systemId  # Append this if present
值得注意的是没有 DOCTYPE 的文档有一个document.doctype === null.
2021-04-13 01:46:16

您还可以使用这一行来获取当前的文档类型。这将适用于任何现代浏览器和 IE 9 及更高版本

new XMLSerializer().serializeToString(document.doctype);
function get_doctype()
{
    var doctype = 
    '<!DOCTYPE ' + 
    document.doctype.name +
    (document.doctype.publicId?' PUBLIC "' +  document.doctype.publicId + '"':'') +
    (document.doctype.systemId?' "' + document.doctype.systemId + '"':'') + '>';
    return doctype;
}

这就是你要找的吗?

alert(document.doctype.publicId);
那只返回-//W3C//DTD HTML 4.01//EN. 我需要整个 DOCTYPE
2021-03-23 01:46:16
也许你需要这样做 --- var doc = '<!DOCTYPE '+document.doctype.name+' PUBLIC "'+document.doctype.publicId+'" "'+document.doctype.systemId+​​'">';
2021-04-06 01:46:16

连接DocumentType.name,.publicId.systemId就像是:

'<!DOCTYPE '+ 
  DocumentType.name+' PUBLIC "'+ //maybe you should check for publicId first
  DocumentType.publicId+'" "'+
  DocumentType.systemId+'">'
我的意思是,它应该打印<!DOCTYPE html>,但是对于这个页面(使用 HTML5 文档类型),我得到<!DOCTYPE html PUBLIC "" "">.
2021-03-28 01:46:16
我猜这不支持 HTML5?
2021-04-02 01:46:16
@Kendall:确实如此,但对于 html5 afaik 来说信息量不大。
2021-04-12 01:46:16