让我们说(在IE8中)我们有一个document
。
现在通常我们可以假设document.childNodes[0]
是doctype。所以
var doctype = document.childNodes[0]
现在我们如何确认而不是假设它是doctype?
doctype.nodeType === Node.COMMENT_NODE;
doctype.tagName === "!"; // same as a comment
doctype.data.indexOf("DOCTYPE ") > -1; // same as any comment containing the word DOCTYPE.
doctype === document.doctype; // false, document.doctype is undefined in IE8
除了假设之外,我怎么知道给定节点是否是doctype?
对于那些不熟悉DOM4的人,请查看DocumentType
只需返回document.doctype
document.childNodes[0]
答案 0 :(得分:2)
我发现在IE7和IE8中,评论的.innerHTML
属性始终是完整的"<!--comment here-->"
,对于doctype节点,它是""
。即使是空评论,.innerHTML
也是"<!---->"
基于此,我创建了:
function isDocType(node) {
return node && (
node.nodeType === 10 || (node.nodeType === 8 && "innerHTML" in node && node.innerHTML === ""));
}
使用测试页面:
<!-- comment1 -->
<!-- comment2 -->
<!---->
<!-- -->
<!-- <!DOCTYPE html> -->
通过isDocType
运行doctype和评论会产生:
LOG: true
LOG: false
LOG: false
LOG: false
LOG: false
LOG: false
答案 1 :(得分:0)
IE8说没有。 :(
但严重的是,除了黑客和假设外,没有干净的方法。
根据评论中的建议,您可以假设评论不是像
那样的文档类型 doctype.data.indexOf("<!DOCTYPE html") !== -1 && doctype.data.indexOf(">") !== -1
或者对DOM结构做出假设
我相信只有注释节点(以及解析器作为注释节点处理的任何内容,例如xml声明)都可以在doctype之前
因此,您可以循环遍历document.childNodes
中的注释节点,直到找到与上述正则表达式匹配的节点。