因此,假设(在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
多姆 get's document.doctype in IE8通过返回document.childNodes[0]
发布于 2012-07-24 09:50:09
我发现在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/
发布于 2011-10-30 11:58:39
IE8说不行。:(
不过,说真的,除了黑客和假设之外,没有干净的方法。
正如注释中所建议的,您可以假设注释不是doctype,例如
doctype.data.indexOf("<!DOCTYPE html") !== -1 && doctype.data.indexOf(">") !== -1
或者对DOM结构进行假设
我认为只有注释节点(以及解析器作为注释节点处理的任何内容,例如xml声明)才能在doctype之前进行。
因此,您只需遍历document.childNodes中的注释节点,直到找到与上述regexp匹配的节点为止。
https://stackoverflow.com/questions/7933344
复制相似问题