createDocument

createDocument

createDocument method (DOM DOMImplementation 界面)

[1] (Document) := DOMImplementation.createDocument ((DOMString) namespaceURI, (DOMString) qualifiedName, (DocumentType) doctype) は、新しい文書 (Document (文書節) 物体) を作成します。

qualifiedName には、文書要素の要素型名を修飾名で指定します。

namespaceURI, doctype は必要がなければ null でも構いません。

[2] 実行結果:

返値Document作成された文書
例外 DOMExceptionINVALID_CHARACTER_ERR修飾名に不正な文字
例外 DOMExceptionNAMESPACE_ERR修飾名が不正か接頭辞があるのに namespaceURInull か、又は予約名前空間名/接頭辞の不正な利用
例外 DOMExceptionWRONG_DOCUMENT_ERRdoctype が既に他の文書で使われているか、又は異なる実装で作成された

doctype.ownerDocument は新しく作成された Document に設定されます。

[3] この method は DOM 2 です。 なお、 HTML のみの DOM 実装では実装しなくても構わないことになっています。

[4] 仕様書:

  1. [DOM2] Document Object Model Core
  2. [DOM3] Document Object Model Core

HTML 文書を作成するには

[5] 仕様によれば、 doctype 引数に適当な値を与えれば HTML 機能など Core 以外の機能を実装した Document を返して良いとされています。また、 DOM水準2createHTMLDocument のような特化したメソッドを使う方法もあると触れられています。

[6] 後者の方法、すなわち HTMLDocument 界面createHTMLDocument メソッドは、旧来の HTML ( XHTML) HTMLDocument を作成するためのもので、 DOM水準2 仕様案には含まれていましたが、 勧告になる前に削除されています。 (それなのに別のモジュールの仕様書に言及が残っているなんてことは DOM の仕様書ではよくあります。) createDocument があれば十分ということらしいです。

[7] 前者の方法、すなわち Document 界面createDocument メソッドに適当な doctype 引数を与える方法は、それ以上の詳細は説明されていません。 つまり、どのような doctype を与えればどのような機能を持った物体が返されるかは実装依存ということになります。

createDocumentType メソッド引数には公開識別子システム識別子がありますから、 DocumentType の種類はこれらから判断されると思われます。 (修飾名もありますが、名前空間URI はないのでここから判断するのは少し不安です。) これらの引数に XHTML で定義されている値を与えれば、 おそらく HTMLDocument が得られるのでしょう。

[8] createDocument の名前空間 URI と局所名で指定: createDocument引数には文書要素名前空間URI修飾名も指定できます。仕様書には何も書かれていませんが、 多くの場合には doctype がなくともこれらの引数の情報だけで実装側としては十分なはずです。

XHTML の場合、名前空間URIhttp://www.w3.org/1999/xhtml修飾名中の局所名html を与えれば、実装によっては HTMLDocument が得られると期待できます。

メモ

[9] null引数にした場合の動作について仕様書は適当すぎる。 (名無しさん [sage])

[10] DOM水準3qualifiedNamenull でもよいと明記しています。 (名無しさん)

[11] DOM水準3によると qualifiedName を指定する場合には XML 1.0名前でなければならないようです。

(名無しさん)

[12] >>10 のため、 DOM水準3では NAMESPACE_ERR の条件として qualifiedNamenullnamespaceURInull ではないときが追加されています。 (名無しさん)

[13] DOM水準3createElementNS では

NAMESPACE_ERR ですが、 createDocument にはそうは書かれていません。 (名無しさん)

[14] Firefox 2 でも Opera 9 でも、 XML 文書が作られるのですが、 Opera 9 では innerHTMLouterHTML の動作が元々の文書と同じになるようです。 つまり、 HTML 文書implementation 属性に入っている DOMImplementationcreateDocument メソッドXHTML 文書を作ると、 namespaceURIXHTML だし、 tagName小文字なのに、 innerHTML 内のタグ名大文字になります。

(名無しさん)

[15] >>14 HTML 文書内の XMLHttpRequest で得た Document もそうなってるっぽい。。。 (名無しさん)

[16] >>15 DOMParser で得たやつでも。

意図的かどうかわからないけど、 これのおかげ/せいで整形式でない値を innerHTML に設定しようとしてもエラーにならない (Firefox 2 ではなる)。

[17] Hawk's W3 Laboratory : XML : JavaScriptでXMLを扱う方法 ( 版) <http://web.archive.org/web/20060902115316/www.hawk.34sp.com/stdpls/xml/js_xml.html>

Geckoベースのブラウザで新規Documentオブジェクトを取得するには、DOM2 Coreで定義された DOMImplementation の createDocumentメソッドを用います。

var domDocument = document.implementation.createDocument("", "", null);

[18] QName 空文字列でいいの?

[19] >>18 DOM3中核は何もいってなかったけど、 Web DOM Core ではちゃんと空文字列は無視することになってるね。

[20] Align with origin changes in HTML · whatwg/dom@20b3f3e ( 版) <https://github.com/whatwg/dom/commit/20b3f3e427180e40531a40d1d93ea0097c221c90>

[21] 520969 – HTMLness of the createDocument() return value should be false regardless of doctype ( 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=520969>

[22] Set createDocument()'s content type based on namespace · whatwg/dom@537e579 ( 版) <https://github.com/whatwg/dom/commit/537e579fac8d0a99544d798bb7d46660e59ffc78>