[1] (
は、新しい文書 (Document) := DOMImplementation.createDocument ((DOMString) namespaceURI, (DOMString) qualifiedName, (DocumentType) doctype)Document (文書節) 物体)
を作成します。
qualifiedName には、文書要素の要素型名を修飾名で指定します。
namespaceURI, doctype
は必要がなければ null でも構いません。
[2] 実行結果:
| 返値 | Document | 作成された文書 |
例外 DOMException | INVALID_CHARACTER_ERR | 修飾名に不正な文字 |
例外 DOMException | NAMESPACE_ERR | 修飾名が不正か接頭辞があるのに namespaceURI が null か、又は予約名前空間名/接頭辞の不正な利用 |
例外 DOMException | WRONG_DOCUMENT_ERR | doctype が既に他の文書で使われているか、又は異なる実装で作成された |
doctype.
は新しく作成された Document に設定されます。ownerDocument
[3] この method は DOM 2 です。 なお、 HTML のみの DOM 実装では実装しなくても構わないことになっています。
[4] 仕様書:
[5]
仕様によれば、 doctype 引数に適当な値を与えれば
HTML 機能など Core
以外の機能を実装した Document
を返して良いとされています。また、 DOM水準2
の createHTMLDocument
のような特化したメソッドを使う方法もあると触れられています。
[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 の場合、名前空間URI に
http://www.w3.org/1999/xhtml、
修飾名中の局所名に html
を与えれば、実装によっては HTMLDocument
が得られると期待できます。
[9]
nullを引数にした場合の動作について仕様書は適当すぎる。
(名無しさん [sage])
[10]
DOM水準3は qualifiedName
は null でもよいと明記しています。
(名無しさん)
[11]
DOM水準3によると
qualifiedName を指定する場合には
XML 1.0 の名前でなければならないようです。
(名無しさん)
[12]
>>10 のため、 DOM水準3では
NAMESPACE_ERR の条件として
qualifiedName が
null で
namespaceURI
が null ではないときが追加されています。
(名無しさん)
[13]
DOM水準3の createElementNS では
xmlns で、名前空間URI
が http://www.w3.org/2000/xmlns/
ではないときhttp://www.w3.org/2000/xmlns
で修飾名も名前空間接頭辞も
xmlns ではないときに NAMESPACE_ERR
ですが、 createDocument
にはそうは書かれていません。
(名無しさん)
[14]
Firefox 2 でも Opera 9 でも、 XML 文書が作られるのですが、
Opera 9 では innerHTML や
outerHTML の動作が元々の文書と同じになるようです。
つまり、 HTML 文書の implementation
属性に入っている DOMImplementation
の createDocument メソッドで
XHTML 文書を作ると、 namespaceURI
は XHTML だし、 tagName も小文字なのに、
innerHTML 内のタグ名は大文字になります。
(名無しさん)
[15]
>>14 HTML 文書内の XMLHttpRequest
で得た Document もそうなってるっぽい。。。
(名無しさん)
意図的かどうかわからないけど、
これのおかげ/せいで整形式でない値を 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);
[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>