37

I know that I can access to doctype object via document.doctype or document.childNodes[0] but my problem is getting doctype as a string. I can do this in chrome and safari by calling document.doctype which returns <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">. However in Firefox, calling document.doctype returns DocumentType object.

Is there a way to get the doctype string in all browsers as in chrome and safari?

Thanks!

HoldOffHunger
  • 18,769
  • 10
  • 104
  • 133
matte
  • 1,196
  • 4
  • 13
  • 21

5 Answers5

80

In all compliant browsers (including Chrome/Safari), document.doctype also returns a DocumentType object. The following code can be used to generate a valid DOCTYPE string.

var node = document.doctype;
var html = "<!DOCTYPE "
         + node.name
         + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '')
         + (!node.publicId && node.systemId ? ' SYSTEM' : '') 
         + (node.systemId ? ' "' + node.systemId + '"' : '')
         + '>';

This method returns the correct string for valid (HTML5) doctypes, eg:

  • <!DOCTYPE html>
  • <!DOCTYPE html SYSTEM "about:legacy-compat">
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

Explanation of the code:

node.name      # Holds the name of the root element, eg: HTML / html
node.publicId  # If this property is present, then it's a public document type.
               #>Prefix PUBLIC
!node.publicId && node.systemId
               # If there's no publicId, but a systemId, prefix SYSTEM
node.systemId  # Append this if present
Christoph
  • 50,121
  • 21
  • 99
  • 128
Rob W
  • 341,306
  • 83
  • 791
  • 678
56

You can also use this one liner to get the current doctype. This will work in any modern browser and IE 9 and higher.

new XMLSerializer().serializeToString(document.doctype);
Pavlo
  • 43,301
  • 14
  • 77
  • 113
Scott
  • 3,290
  • 4
  • 29
  • 48
3
function get_doctype()
{
    var doctype = 
    '<!DOCTYPE ' + 
    document.doctype.name +
    (document.doctype.publicId?' PUBLIC "' +  document.doctype.publicId + '"':'') +
    (document.doctype.systemId?' "' + document.doctype.systemId + '"':'') + '>';
    return doctype;
}
codeassembly
  • 1,112
  • 1
  • 9
  • 17
1

Is that what are you looking for ?

alert(document.doctype.publicId);
T1000
  • 2,909
  • 7
  • 36
  • 53
1

Concatenate DocumentType.name, .publicId and .systemId. Something like:

'<!DOCTYPE '+ 
  DocumentType.name+' PUBLIC "'+ //maybe you should check for publicId first
  DocumentType.publicId+'" "'+
  DocumentType.systemId+'">'
KooiInc
  • 119,216
  • 31
  • 141
  • 177