DOMImplementation#
DOMImplementation.createDocumentType()#
Metoda createDocumentType()
tworzy nowy węzeł typu DocumentType
(tzw. deklarację typu dokumentu) z określoną nazwą, identyfikatorem publicznym oraz identyfikatorem systemowym, którego właścicielem jest dokument skojarzony z daną implementacją DOM.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_DTD = domImplementation.createDocumentType(qualifiedName, publicId, systemId);
gdzie poszczególne człony oznaczają:
- new_DTD - referencja do nowej deklaracji typu dokumentu.
- domImplementation - implementacja DOM będąca obiektem kontekstu.
- qualifiedName - łańcuch znakowy reprezentujący nazwę w nowej deklaracji typu dokumentu.
- publicId - łańcuch znakowy reprezentujący identyfikator publiczny w nowej deklaracji typu dokumentu.
- systemId - łańcuch znakowy reprezentujący identyfikator systemowy w nowej deklaracji typu dokumentu.
Algorytm wywołania metody createDocumentType(qualifiedName, publicId, systemId)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Zweryfikuj qualifiedName. Zrzuć ponownie każdy wyjątek.
- Zwróć nowy węzeł typu
DocumentType
, z nazwą wskazywaną przez qualifiedName, z identyfikatorem publicznym wskazywanym przez publicId, z identyfikatorem systemowym wskazywanym przez systemId oraz właścicielem będącym dokumentem skojarzonym z obiektem kontekstu.
Metoda nie weryfikuje poprawności wszystkich przekazywanych łańcuchów znakowych wymaganych dla deklaracji typów dokumentów w przypadku XML-a, np. pod względem dopasowania do wzorca PubidChar
w identyfikatorze publicznym lub unikania znaków '"'
lub "'"
w identyfikatorze systemowym.
Nowa deklaracja typu dokumentu zwracana przez metodę createDocumentType()
nie jest częścią danego drzewa dokumentu, chyba że zostanie do niego wstawiona w prawidłowy sposób, np. za pomocą metody Node.insertBefore()
czy Node.replaceChild()
, lub zostanie dołączona automatycznie w trakcie tworzenia nowego dokumentu za pośrednictwem jednej z metod konstruujących, które pobierają deklarację typu dokumentu jako jeden ze swoich argumentów, jak w przypadku DOMImplementation.createDocument()
. Dlatego nowa deklaracja typu dokumentu nie będzie posiadała rodzica (wartość null
), aczkolwiek dalej posiada jakiegoś właściciela.
Obiekt zwracany przez metodę createDocumentType
implementuje interfejs DocumentType, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).
Więcej szczegółów związanych z deklaracjami typów dokumentów umieściłem w zbiorczym dziale "Podstawy - Rodzaje dokumentów".
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function readDTD(whatDTD){
var dtd = null;
if (whatDTD == "dtd1"){
dtd = document.doctype;
}
else if (whatDTD == "dtd2"){
dtd = document.implementation.createDocumentType("HTML", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd");
}
else if (whatDTD == "dtd3"){
dtd = document.implementation.createDocumentType("źdźbło", "dowolny publiczny ID", "");
}
else if (whatDTD == "dtd4"){
dtd = document.implementation.createDocumentType("źdźbło", "", "dowolny systemowy ID");
}
else if (whatDTD == "dtd5"){
dtd = document.implementation.createDocumentType("źdźbło", "dowolny publiczny ID", "dowolny systemowy ID");
}
else if (whatDTD == "dtd6"){
dtd = document.implementation.createDocumentType("xml:xmlns", "", "");
}
var info = document.getElementById("info");
if (dtd != null){
info.innerHTML = "Interfejs pobranego węzła: " + dtd
+ "<br>" + "Właściwość name: " + dtd.name
+ "<br>" + "Właściwość publicId: " + dtd.publicId
+ "<br>" + "Właściwość systemId: " + dtd.systemId
+ "<br><br>" + "Właściwość ownerDocument: " + dtd.ownerDocument
+ "<br>" + "Właściwość nodeName: " + dtd.nodeName
+ "<br>" + "Właściwość nodeType: " + dtd.nodeType + "<br>";
var newText = document.createTextNode("");
newText.data = new XMLSerializer().serializeToString(dtd);
info.appendChild(newText);
}
else{
try{
if (whatDTD == "dtd7"){
dtd = document.implementation.createDocumentType("0", "", "");
}
else if (whatDTD == "dtd8"){
dtd = document.implementation.createDocumentType(":", "", "");
}
}
catch(e){
info.innerHTML = "Niewłaściwa nazwa '0' dla tworzonego typu dokumentu dlatego zrzucony zostanie błąd:"
+ "<br>" + e + "<br>" + e.constructor;
}
}
}
</script>
</head>
<body>
<p>DTD 1 : <!DOCTYPE html></p>
<p>DTD 2 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"></p>
<p>DTD 3 : <!DOCTYPE źdźbło PUBLIC "dowolny publiczny ID"></p>
<p>DTD 4 : <!DOCTYPE źdźbło SYSTEM "dowolny systemowy ID"></p>
<p>DTD 5 : <!DOCTYPE źdźbło PUBLIC "dowolny publiczny ID" "dowolny systemowy ID"></p>
<p>DTD 6 : <!DOCTYPE xml:xmlns></p>
<p>DTD 7 : <!DOCTYPE 0></p>
<p>DTD 8 : <!DOCTYPE :></p>
<p>Kliknij konkretny przycisk by utworzyć i odczytać dane dla poszczególnych DTD.</p>
<input type="button" value="DTD 1" onclick="readDTD('dtd1')">
<input type="button" value="DTD 2" onclick="readDTD('dtd2')">
<input type="button" value="DTD 3" onclick="readDTD('dtd3')">
<input type="button" value="DTD 4" onclick="readDTD('dtd4')">
<input type="button" value="DTD 5" onclick="readDTD('dtd5')">
<input type="button" value="DTD 6" onclick="readDTD('dtd6')">
<input type="button" value="DTD 7" onclick="readDTD('dtd7')">
<input type="button" value="DTD 8" onclick="readDTD('dtd8')">
<p style="color: blue;">Szczegółowe informacje:</p>
<p id="info"></p>
</body>
</html>
Na chwilę obecną jedynie przeglądarki Firefox i Chrome obsługują metodę createDocumentType()
zgodnie z najnowszymi wymaganiami specyfikacji DOM4. Pozostałe programy implementują wcześniejsze wytyczne i zwracają nowe deklaracje typów dokumentów bez żadnego właściciela.
Składnia Web IDL#
interface DOMImplementation { [NewObject] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DOMString systemId); };