如何检查DOM节点是否是表示doctype声明的节点?

时间:2011-10-28 18:31:24

标签: html dom internet-explorer-8 doctype

让我们说(在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

,即可在IE8中DOM-shim获取document.childNodes[0]

2 个答案:

答案 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

请参阅http://jsfiddle.net/AEYt4/

答案 1 :(得分:0)

IE8说没有。 :(

但严重的是,除了黑客和假设外,没有干净的方法。

根据评论中的建议,您可以假设评论不是像

那样的文档类型

doctype.data.indexOf("<!DOCTYPE html") !== -1 && doctype.data.indexOf(">") !== -1

或者对DOM结构做出假设

  

我相信只有注释节点(以及解析器作为注释节点处理的任何内容,例如xml声明)都可以在doctype之前

因此,您可以循环遍历document.childNodes中的注释节点,直到找到与上述正则表达式匹配的节点。