Вот простая скрипка:
alert(document.doctype.valueOf())
Он создает [object DocumentType]
, как и ожидалось.
Однако, когда я нажимаю F12 и просто набираю document.doctype.valueOf()
в консоли JavaScript (Chrome, IE11), я вижу:
<!DOCTYPE html>
Почему это несоответствие, и какое свойство (если оно есть) действительно отображается в консольном режиме?
[UPDATE] Когда я упомянул, что document.doctype.outerHTML
работал до тех пор, пока IE11 в комментариях к @BlueSkies не ответит, я был не совсем прав. В моем случае я размещаю WinForms версию IE WebBrowser
в приложении С#. Я только что обнаружил, что это работает в IE11 тоже:
dynamic domDocument = webBrowser.Document.DomDocument;
// this shows '<!DOCTYPE html PUBLIC "" "">'
string doctype = domDocument.doctype.outerHTML;
MessageBox.Show(doctype);
// this shows 'undefined'
domDocument.parentWindow.execScript("alert(document.doctype.outerHTML)");
По-видимому, он работает извне, но не изнутри страницы. Интересный, но ненадежный. Думаю, я не должен использовать document.doctype.outerHTML
даже в этом приложении на основе IE.
Значение .valueOf()
возвращает ни одного вывода. То, что он возвращает, является фактическим узлом.
Таким образом, alert()
предоставляет вам .toString()
узла, а консоли Chrome/IE просто решили сериализовать узел в HTML.
document.doctype.valueOf() === document.doctype; // true
Вот небольшой эксперимент...
document.doctype.toString = function() { return "foobar"; }
alert(document.doctype.valueOf()); // shows "foobar"
.inner/outerHTML
может дать вам разметку. Консоль является дополнением. Там нет спецификации, которая определяет его поведение.
name
,publicId
иsystemId
дляdocument.doctype
.document.doctype
?