compareDocumentPosition
で、編集画面が使いにくい(投稿関係ボタンをテキスト・エリアの下に)のを作るときにドキュメントが全然見つからずに苦労したcompareDocumentPositionについて
そもそもieだと contains で「エレメントは親子関係にあるか?」が調べられるのだけれど、Mozillaではその関数は定義されてなさそう。Firebugでエレメントを見ているとcompareDocumentPositionというそれっぽい関数を見つけたのはいいが、使い方がさっぱりわからない…
DOM関係のドキュメントを調べるときにとても参考になるJavaDocには
short compareDocumentPosition(Node other) throws DOMException
ドキュメントでの位置について参照ノード (このメソッドが呼び出されているノード) とパラメータとして渡されたノードをドキュメント順に比較します。
- パラメータ
- other - 参照ノードと比較するノード
- 戻り値
- 参照ノードに対するノードの相対的位置
- 例外
- DOMException - NOT_SUPPORTED_ERR: 比較されたノードが、一貫した実装固有の結果を返すようになっていない、異なる DOM 実装からのものである場合に発生する
- 導入されたバージョン
- DOM Level 3
と数値が返されることは書かれているけど、どんな数値が返されるかは書かれていない! W3C の文章も同じ。
調べてみると、こんな定義っぽい
a.compareDocumentPosition(b) の時に
- DOCUMENT_POSITION_DISCONNECTED (1)
- 同じdocumentに接続されてないよ
- DOCUMENT_POSITION_PRECEDING (2)
- bはaより前にあるよ
- DOCUMENT_POSITION_FOLLOWING (4)
- bはaより後にあるよ
- DOCUMENT_POSITION_CONTAINS (8)
- bはaの子孫だよ
- DOCUMENT_POSITION_CONTAINED_BY (16)
- bはaの祖先だよ
- DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC (32)
- 実装依存
しらべる.compareDocumentPosition( ... ) の時の、それぞれの位置にあるエレメントを返した場合の返値 document +-DOCUMENT_POSITION_PRECEDING +-DOCUMENT_POSITION_CONTAINS & DOCUMENT_POSITION_PRECEDING = 10 | +- DOCUMENT_POSITION_PRECEDING | +- しらべるタグ | + +- DOCUMENT_POSITION_CONTAINED_BY & DOCUMENT_POSITION_FOLLOWING = 20 | +- DOCUMENT_POSITION_FOLLOWING +-DOCUMENT_POSITION_FOLLOWING +-DOCUMENT_POSITION_DISCONNECTED
こんなかんじ
DOCUMENT_POSITION_PRECEDINGとかはdocumentのプロパティーとしてとれる。a==bの時は0がかえるぽい。
使用例はここ