DOMImplementation#
DOMImplementation.createHTMLDocument()#
Metoda createHTMLDocument()
tworzy nowy węzeł typu Document
(tzw. dokument HTML) z określonym tytułem i minimalną podstawową zawartością.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_HTML = domImplementation.createHTMLDocument([title]);
gdzie poszczególne człony oznaczają:
- new_HTML - referencja do nowego dokumentu HTML.
- domImplementation - implementacja DOM będąca obiektem kontekstu.
- title - opcjonalny łańcuch znakowy reprezentujący treść tytułu dla nowego dokumentu HTML.
Algorytm wywołania metody createHTMLDocument(title)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Niech doc będzie nowym węzłem typu
Document
(wewnętrznie dokumentem HTML). - Ustaw typ zawartości w doc na "
text/html
". - Utwórz nowy węzeł typu
DocumentType
z nazwą będącą łańcuchem znakowym "html
" oraz właścicielem będącym doc, a następnie dodaj go do doc. - Utwórz now element typu
html
w przestrzeni nazw HTML, a następnie dodaj go do doc. - Utwórz now element typu
head
w przestrzeni nazw HTML, a następnie dodaj go do elementu typyhtml
utworzonego w poprzednim kroku. Jeśli argument title nie został pominięty to wykonaj poniższe podkroki:
- Utwórz nowy element typu
title
w przestrzeni nazw HTML, a następnie dodaj go do elementu typuhead
utworzonego w poprzednim kroku. - Utwórz nowy węzeł typu
Text
, ustaw jego dane tekstowe na title (dopuszczalny jest pusty łańcuch znakowy), a następnie dodaj go do elementu typutitle
utworzonego w poprzednim kroku.
- Utwórz nowy element typu
- Utwórz nowy element typu
body
w przestrzeni nazw HTML, a następnie dodaj go do elementu typuhtml
utworzonego we wcześniejszym kroku. - Pochodzeniem w doc jest pochodzenie w dokumencie skojarzonym z obiektem kontekstu.
- Zwróć doc.
Z perspektywy znaczników metoda createHTMLDocument()
zwróci następującą strukturę (zakładamy, że tytuł jest opcjonalny i wszelkie znaki nowej linii oraz tabulatory nie reprezentują dodatkowych węzłów tekstowych, a ich jedynym zadanie jest poprawa czytelności zapisu):
<!DOCTYPE html> <html> <head> <title>title</title> </head> <body> </body> </html>
Istotną sprawą jest to, że metoda createHTMLDocument()
zwraca obiekt typu Document
(wewnętrznie dokument HTML) z cechami i podstawową zawartością właściwą dla dokumentów HTML, w przeciwieństwie do konstruktora new Document()
, który tworzy pusty obiekt typu Document
(wewnętrznie dokument XML), lub metody DOMImplementation.createDocument()
, która tworzy obiekt typu XMLDocument
(wewnętrznie też dokument XML), ale z opcjonalnym elementem dokumentowym oraz deklaracją typu dokumentu.
Z praktycznego punktu widzenia sposób utworzenia dokumentu determinuje wiele jego poszczególnych cech, ale zachowanie to jest wyjątkowo niespójne i w głównej mierze zależy od danej przeglądarki internetowej (szczegóły).
Obiekt zwracany przez metodę createDocument()
implementuje interfejs Document, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).
Prosty przykład:
<script>
function getInfoDoc(desc, whatDoc){
doc.write(desc + "<br>");
doc.write("Interfejs: " + whatDoc + "<br>");
doc.write("title: " + whatDoc.title + "<br>");
doc.write("getElementsByTagName('title').length: " + whatDoc.getElementsByTagName('title').length + "<br>");
doc.write("getElementsByTagName('*').length: " + whatDoc.getElementsByTagName('*').length + "<br>");
doc.write("contentType: " + whatDoc.contentType + "<br>");
doc.write("compatMode: " + whatDoc.compatMode + "<br>");
doc.write("doctype: " + whatDoc.doctype + "<br>");
if (whatDoc.doctype){
doc.write("doctype.name: " + whatDoc.doctype.name + "<br>");
doc.write("doctype.publicId: " + whatDoc.doctype.publicId + "<br>");
doc.write("doctype.systemId: " + whatDoc.doctype.systemId + "<br>");
}
doc.write("documentElement: " + whatDoc.documentElement + "<br>");
if (whatDoc.documentElement){
doc.write("documentElement.tagName: " + whatDoc.documentElement.tagName + "<br>");
doc.write("documentElement.namespaceURI: " + whatDoc.documentElement.namespaceURI + "<br>");
doc.write("documentElement.prefix: " + whatDoc.documentElement.prefix + "<br>");
}
doc.write("documentURI: " + whatDoc.documentURI + "<br>");
doc.write("URL: " + whatDoc.URL + "<br>");
doc.write("origin: " + whatDoc.origin + "<br>");
doc.write("characterSet: " + whatDoc.characterSet + "<br>");
doc.write("charset: " + whatDoc.charset + "<br>");
doc.write("inputEncoding: " + whatDoc.inputEncoding + "<br>");
doc.write("Nowy dokument po serializacji: " + "<br>");
var newText = document.createTextNode("");
newText.data = new XMLSerializer().serializeToString(whatDoc);
doc.getElementsByTagName("html")[0].lastChild.appendChild(newText);
doc.write("<br><br>");
}
var doc = document; // domyślny dokument tworzony przez parser HTML
var newDocHTML = doc.implementation.createHTMLDocument("Jakiś tytuł"); // nowy dokument HTML
getInfoDoc("Parametry dla createHTMLDocument('Jakiś tytuł'):", newDocHTML);
newDocHTML = doc.implementation.createHTMLDocument(""); // nowy dokument HTML
getInfoDoc("Parametry dla createHTMLDocument(''):", newDocHTML);
newDocHTML = doc.implementation.createHTMLDocument(); // nowy dokument HTML
getInfoDoc("Parametry dla createHTMLDocument():", newDocHTML);
</script>
Na chwilę obecną jedynie przeglądarki Firefox i Chrome obsługują metodę createHTMLDocument()
zgodnie z najnowszymi wymaganiami specyfikacji DOM4, gdyż faktycznie zezwalają na pominięcie argumentu przy wywołaniu metody.
Metoda createHTMLDocument()
pojawia się dopiero w specyfikacji DOM4. Prawdę mówiąc to po raz pierwszy zdefiniowano ją w interfejsie HTMLDOMImplementation w roboczej wersji specyfikacji DOM Level 2 HTML, ale w finalnej rekomendacji tejże specyfikacji został on pominięty.
Składnia Web IDL#
interface DOMImplementation { [NewObject] Document createHTMLDocument(optional DOMString title); };