2011-05-22 9 views
26

Sé que puedo acceder al objeto doctype a través de document.doctype o document.childNodes[0] pero mi problema es obtener doctype como cadena. Puedo hacer esto en Chrome y Safari llamando al document.doctype, que devuelve <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">. Sin embargo, en Firefox, al llamar al document.doctype se devuelve el objeto DocumentType.Obtener DocType de un HTML como cadena con Javascript

¿Hay alguna manera de obtener la cadena del doctype en todos los navegadores como en cromo y safari?

Gracias!

Respuesta

68

En todos los navegadores compatibles (incluyendo Chrome/Safari), document.doctype también devuelve un objeto DocumentType. El siguiente código se puede usar para generar una cadena DOCTYPE válida.

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

Este método devuelve la cadena correcta para valid (HTML5) doctypes, por ejemplo:

  • <!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">

Explicación del código:

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 
+11

Merece la pena señalar que los documentos sin DOCTYPE tienen 'document.doctype === null'. –

1

¿Eso es lo que estás buscando?

alert(document.doctype.publicId); 
+0

Que solo devuelve '- // W3C // DTD HTML 4.01 // EN'. Necesito DOCTYPE completo – matte

+1

Quizás necesite hacerlo --- var doc = ' '; – T1000

2

Concatenate DocumentType.name, .publicId y .systemId. Algo así como:

'<!DOCTYPE '+ 
    DocumentType.name+' PUBLIC "'+ //maybe you should check for publicId first 
    DocumentType.publicId+'" "'+ 
    DocumentType.systemId+'">' 
+0

Supongo que esto no es compatible con HTML5 –

+0

@Kendall: lo hace, pero no es muy informativo para html5 afaik. – KooiInc

+3

Quiero decir, debería imprimir '', pero para esta página (que usa el tipo de documento HTML5), obtengo ''. –

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; 
} 
32

También puede usar este revestimiento para obtener el tipo de documento actual. Esto funcionará en any modern browser and IE 9 and higher.

new XMLSerializer().serializeToString(document.doctype); 
+6

Mucho más simple que la respuesta aceptada. – Miscreant

Cuestiones relacionadas