Как проверить, является ли DOM Node узлом, представляющим объявление doctype? - PullRequest
8 голосов
/ 28 октября 2011

Итак, скажем (в IE8), что у нас есть document.

Теперь обычно мы можем предположить, что document.childNodes[0] - это тип документа.Итак,

var doctype = document.childNodes[0]

Теперь, как нам подтвердить , а не предполагать, что это тип документа?

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

Помимо предположений, какЯ должен был знать, является ли данный узел типом документа?

Для тех из вас, кто не знаком с DOM4, взгляните на DocumentType

DOM-shim get document.doctype в IE8, просто возвращая document.childNodes[0]

Ответы [ 2 ]

2 голосов
/ 24 июля 2012

Я выяснил, что в 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 дают:

LOG: true 
LOG: false 
LOG: false 
LOG: false 
LOG: false 
LOG: false

См. http://jsfiddle.net/AEYt4/

0 голосов
/ 30 октября 2011

IE8 говорит нет. (

Серьезно, хотя, кроме взломов и предположений, нет чистого пути.

Как указано в комментариях, вы можете предположить, что комментарии не являются типом типа

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

Или сделайте предположения о структуре DOM

Я полагаю, что только типу комментария могут предшествовать узлы комментариев (и все, что обрабатывается синтаксическим анализатором как узел комментариев, например объявление xml)

Таким образом, вы можете просто зацикливаться на узлах комментариев в document.childNodes, пока не найдете тот, который соответствует приведенному выше регулярному выражению.

...