[1] 各 [[DOM]] モジュールは1つ以上の[DFN[[RUBYB[機能] [feature]]]] (名前と版) を定義します。 [2] 仕様書: - [[DOM 1]] -- Core [CODE(DOMm)[hasFeature]] -- Errata Section 1.2 Interface DOMImplementation - [[DOM 2]] -- Core [CODE(DOMm)[hasFeature]] -- Errata core-5. 2001-01-17. [error]. DOMImplementation.hasFeature -- Errata core-14. 2001-07-11. [clarification]. DOMImplementation.hasFeature - [[DOM 3]] -- Core 1.3.6 DOM Features -- Core [CODE(DOMm)[getDOMImplementation]] -- Core [CODE(DOMm)[getDOMImplementationList]] -- Core [CODE(DOMm)[getFeature]] -- Core [CODE(DOMm)[hasFeature]] -- Core [CODE(DOMm)[getFeature]] [[#comment]] * 構文 [3] 機能名では、大文字・小文字は区別されません [SRC[DOM 1 [ABBR[FE][First Edition]] [CODE(DOMm)[hasFeature]], DOM 1 [ABBR[SE][Second Edition]] [CODE(DOMm)[hasFeature]], DOM 2 Core [CODE(DOMm)[hasFeature]], DOM 3 Core 1.3.6]]。 DOM 1 [ABBR[FE][First Edition]] では、 [SAMP(DOM)[HTML]] と [SAMP(DOM)[XML]] の2つの値だけが認められていました [SRC[DOM 1 [ABBR[FE][First Edition]] [CODE(DOMm)[hasFeature]]]]。 DOM 1 [ABBR[SE][Second Edition]] と DOM 2 は、 [[XML 1.0]] の [CODE(ABNF)[[[Name]]]] でなければならないとしています [SRC[DOM 1 [ABBR[SE][Second Edition]] [CODE(DOMm)[hasFeature]], DOM 2 Core [CODE(DOMm)[hasFeature]]]]。 DOM 3 にはこのような制限はないようです。 [9] >>3 だけしか規定がないようですが、 [CODE(DOMp)[[[features]]]] で使い物になる値にしたければ、次の配慮が必要です。 - 最初の1文字に [CODE(char)[+]] を使わない - [CODE(char)[[[SP]]]] を使わない - 名前は数字からはじめない。 版は数字からはじめる。 版は、メソッドの引数として使われるところで [Q[version number]] とされていますから、数しか認められないと思われます。 DOM 1 では [SAMP(DOM)[1.0]] だけ、 DOM 2 では [SAMP(DOM)[1.0]] と [SAMP(DOM)[2.0]] だけが指定できるとされていました [SRC[DOM 1 [ABBR[FE][First Edition]] [CODE(DOMm)[hasFeature]], DOM 1 [ABBR[SE][Second Edition]] [CODE(DOMm)[hasFeature]], DOM 2 Core [CODE(DOMm)[hasFeature]]]]。 DOM 3 ではそのような制限はないようです。 [11] 衝突の虞を防ぐため、 DOM 仕様書以外で定義する機能の名前は固有にするべきです。 衝突を防ぐ方法として、以前は[[逆ドメイン名]]を使うべきとされていました [SRC[DOM 1 [ABBR[SE][Second Edition]] [CODE(DOMm)[hasFeature]], DOM 2 Core [CODE(DOMm)[hasFeature]]]] が、 後に DOM 仕様書の規定外に改められました [SRC[DOM 2 Errata core-5, DOM 3 Core 1.3.6]]。 [[SVG 1.0]] の DOM は逆ドメイン名の機能名を使っていましたが、 [[SVG 1.1]] では [[URI参照]]を使っています。 SVG の DOM 以外の機能名やプログラム言語・ライブラリ等で機能名を識別するために URI 参照が使われることが増えており、そのため逆ドメイン名より自由度が高い URI 参照を使えるようにと DOM の規定も変更されたのでしょう。 [[#comment]] * 既知の値 [4] ,機能名 ,版 ,説明 ,[CODE(DOM)[[[Core]]]] ,[CODE(DOM)[2.0]] ,Core Module (Level 2) [SRC[DOM 2 Core 1.2, DOM 3 Core 1.4]] ,[CODE(DOM)[Core]] ,[CODE(DOM)[3.0]] ,Core Module (Level 3) [SRC[DOM 3 Core 1.4]] ,[CODE(DOM)[[[HTML]]]],[CODE(DOM)[1.0]],HTML Module (Level 1) [SRC[DOM 1 2.1]] ,[CODE(DOM)[[[org.w3c.dom.smil]]]],,SMIL DOM の例 [SRC[DOM 1 [ABBR[SE][Second Edition]] [CODE(DOMm)[hasFeature]]]] ,[CODE(DOM)[[[org.w3c.dom.svg]]]],,SVG DOM の例 [SRC[DOM 2 Core [CODE(DOMm)[hasFeature]]]] ,[CODE(DOM)[[[XML]]]] ,[CODE(DOM)[1.0]] ,XML Module (Level 1) [SRC[DOM 1 1.3, DOM 3 Core 1.5]] ,[CODE(DOM)[XML]] ,[CODE(DOM)[2.0]] ,XML Module (Level 2) [SRC[DOM 2 Core 1.3, DOM 3 Core 1.5]] ,[CODE(DOM)[XML]] ,[CODE(DOM)[3.0]] ,XML Module (Level 3) [SRC[DOM 3 Core 1.5]] ,[CODE(DOM)[[[XMLVersion]]]] ,[CODE(DOM)[1.0]] ,[[XML 1.0]] [SRC[DOM 3 Core [CODE(DOMa)[xmlVersion]], DOM 3 Core 1.5]] ,[CODE(DOM)[XMLVersion]] ,[CODE(DOM)[1.1]] ,[[XML 1.1]] [SRC[DOM 3 Core [CODE(DOMa)[xmlVersion]]]] [10] - [[DOM 1]] -- [ABBR[SE][Second Edition]] Compliance -- 1.3. Extended Interfaces -- 2.1. Introduction - [[DOM 2]] -- Core Conformance -- Core 1.2. Fundamental Interfaces -- Core 1.3. Extended Interfaces - [[DOM 3]] -- Core Conformance -- Core 1.4 Fundamental Interfaces: Core Module -- Core [CODE(DOMa)[xmlVersion]] -- Core 1.5 Extended Interfaces: XML Module [[#comment]] * 他との関係 [5] 応用は、メソッド [CODE(DOMm)[[[getDOMImplementation]] ([VAR(DOMp)[features]])]] やメソッド [CODE(DOMm)[[[getDOMImplementationList]] ([VAR(DOMp)[features]])]] を使うと特定の機能を実装した DOM [[実装]]を要求できます。 メソッド [CODE(DOMm)[[[hasFeature]] ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] やメソッド [CODE(DOMm)[[[isSupported]] ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] を使うと特定の機能が実装されているか調べることができます。 (版を問わない時は [CODE(DOM)[[[null]]]] や空文字列を指定できます。) [6] DOM 2 モジュールまででは、既存の界面の拡張である界面はみな、 その拡張に対応する機能に対応していれば、束縛規定の型変換機構を使って利用することができました。 (例えば、 [CODE(DOM)[[[Events]]]] 機能に対応していれば [CODE(DOMi)[[[Node]]]] の実現値から [CODE(DOMi)[[[EventTarget]]]] (is‐a [CODE(DOMi)[Node]]) の実現値を得ることができました。) DOM 3 では、特定の DOM を実装する部分部品と強調できるべきとされています ([[DOM//実装//混合]]を参照してください)。このため、メソッド [CODE(DOMm)[[[getFeature]] ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] が用意されており、特定の機能を実装した実現値を得ることができます。 [7] メソッド [CODE(DOMm)[hasFeature ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] やメソッド [CODE(DOMm)[isSupported ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] では、 [CODE(DOMp)[feature]] 名の前に [CODE(char)[+]] を付けることができます。付けなければ直接型変換可能な界面の機能だけが考慮されますが、 付けた場合は [CODE(DOMm)[getFeature ([VAR(DOMp)[feature]], [VAR(DOMp)[version]])]] を使って得られるものも考慮に入れられます。 [[#comment]] * 例 [8] 型変換の例: [PRE[ my EventTarget $evt; if ($node.[CODE(DOMm)[isSupported ([CODE(DOMp)["Events"]], [CODE(DOMp)["3.0"]])]]) { ## 直接型変換可能な場合 $evt = (EventTarget) $node; } else if ($node.[CODE(DOMm)[isSupported ([CODE(DOMp)["+Events"]], [CODE(DOMp)["3.0"]])]]) { ## 間接的に型変換可能な場合 $evt = (EventTarget) $node.[CODE(DOMm)[getFeature ([CODE(DOMp)["Events"]], [CODE(DOMp)["3.0"]])]]; } ]PRE] [[#comment]] * memo