2011-05-22 5 views
26

Je sais que je peux accéder à l'objet doctype via document.doctype ou document.childNodes[0] mais mon problème est d'obtenir doctype comme une chaîne. Je peux le faire en chrome et safari en appelant document.doctype qui renvoie <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">. Toutefois, dans Firefox, l'appel document.doctype renvoie l'objet DocumentType.Obtenir DocType d'un HTML en tant que chaîne avec Javascript

Existe-t-il un moyen d'obtenir la chaîne doctype dans tous les navigateurs comme dans chrome et safari?

Merci!

Répondre

68

Dans tous les navigateurs compatibles (y compris Chrome/Safari), document.doctype retourne également un objet DocumentType. Le code suivant peut être utilisé pour générer une chaîne DOCTYPE valide.

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

Cette méthode renvoie la chaîne correcte pour valid (HTML5) doctypes, par exemple:

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

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

Les documents notant sans DOCTYPE ont un 'document.doctype === null'. –

1

Est-ce ce que vous cherchez?

alert(document.doctype.publicId); 
+0

Cela renvoie uniquement '- // W3C // DTD HTML 4.01 // EN'. J'ai besoin de DOCTYPE complet – matte

+1

Peut-être que vous avez besoin de faire --- var doc = ' '; – T1000

2

Concatenate DocumentType.name, .publicId et .systemId. Quelque chose comme:

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

Je suppose que cela ne supporte pas HTML5? –

+0

@Kendall: c'est le cas, mais ce n'est pas très instructif pour html5 afaik. – KooiInc

+3

Je veux dire, il devrait imprimer '', mais pour cette page (qui utilise HTML5 doctype), j'obtiens ''. –

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

Vous pouvez également utiliser cette ligne pour obtenir le doctype en cours. Cela fonctionnera dans any modern browser and IE 9 and higher.

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

Beaucoup plus simple que la réponse acceptée. – Miscreant

Questions connexes