Node.compareDocumentPosition() - 2つのノードの位置関係を確認する
公開日:
Node.compareDocumentPosition()は、Nodeのメソッドです。自身と対象のノードの位置関係を確認します。結果は、定数に対応する値のビットマスクで返ります。
概要
IDL
unsigned short compareDocumentPosition(Node other);
引数
返り値
unsigned short
自身と相手の位置関係を表すビットマスク。位置関係は複数が混在する場合がある。
値 | 定数 | 説明 |
---|---|---|
0x01 | DOCUMENT_POSITION_DISCONNECTED | 2つのノードは同じツリーにない。 |
0x02 | DOCUMENT_POSITION_PRECEDING | 自分から見て、相手は前にある。 |
0x04 | DOCUMENT_POSITION_FOLLOWING | 自分から見て、相手は後にある。 |
0x08 | DOCUMENT_POSITION_CONTAINS | 自分から見て、相手は祖先である。 |
0x10 | DOCUMENT_POSITION_CONTAINED_BY | 自分から見て、相手は子孫である。 |
0x20 | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | 位置関係が定まってない。例えば、document.createTextNode() を比較した時など。 |
脚注
unsigned short
0〜216-1の整数。
仕様書
説明
compareDocumentPosition()は、自身と相手の位置関係を調べるためのメソッドです。位置関係は、複数の種類が混在する場合があります。例えば、下記の場合、div#foo
から見て、p#bar
は、後にあり(0x04
)、かつ、子孫です(0x10
)。そういうことがあるため、結果はビットマスクで返ります。if文などで比較を行なうには、ビット演算子を利用しましょう。これは難しい話ではなく単純に、==
や===
ではなく&
を使えば、true
かfalse
かを判定できるということです。
HTML
<!-- div#fooから見てp#barは後にある -->
<!-- div#fooから見てp#barは子孫である -->
<div id="foo">
<p id="bar">SYNCER</p>
</div>
JavaScript
// 要素を取得
var element = document.getElementById( "foo" ) ;
var otherNode = document.getElementById( "bar" ) ;
// メソッドを実行
var result = element.compareDocumentPosition( otherNode ) ;
// ビット演算子で確認 (値を利用)
if ( result & 0x01 ) {} // false
if ( result & 0x02 ) {} // false
if ( result & 0x04 ) {} // true
if ( result & 0x08 ) {} // false
if ( result & 0x10 ) {} // true
if ( result & 0x20 ) {} // false
// ビット演算子で確認 (定数を利用)
if ( result & Node.DOCUMENT_POSITION_DISCONNECTED ) {} // false
if ( result & Node.DOCUMENT_POSITION_PRECEDING ) {} // false
if ( result & Node.DOCUMENT_POSITION_FOLLOWING ) {} // true
if ( result & Node.DOCUMENT_POSITION_CONTAINS ) {} // false
if ( result & Node.DOCUMENT_POSITION_CONTAINED_BY ) {} // true
if ( result & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC ) {} // false
サンプルコード
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>【デモ】Node.compareDocumentPosition() - 2つのノードの位置関係を確認する</title>
<link rel="canonical" href="https://syncer.jp/Web/API_Interface/Reference/IDL/Node/compareDocumentPosition/">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<script src="https://demo.syncer.jp/js/demo-web_api_interface.js"></script>
<script>
window.addEventListener( "load", function () {
syncer.setup ( {
method: {
execute: {
use: true ,
callback: [
{
function: (typeof myMethod === "function" ? myMethod : null) ,
}
] ,
} ,
} ,
error: {
use: true ,
} ,
console: {
use: true ,
} ,
htmlElement: {
use: true ,
elements: [ {
element: document.getElementById( "hoge" ) ,
content: true ,
}, ] ,
} ,
} ) ;
} ) ;
</script>
<style>
body {
font: 400 15px/1.618 -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica Neue, Hiragino Kaku Gothic ProN, メイリオ, meiryo, sans-serif ;
background-color: #fff ;
}
</style>
</head>
<body>
<p>下記のdiv要素(自分)とp要素(相手)の位置関係を、compareDocumentPosition()で取得します。デフォルトでは、DOCUMENT_POSITION_FOLLOWING(相手が自分の後方)とDOCUMENT_POSITION_CONTAINED_BY(相手が自分の子孫)を満たしています。</p>
<div id="hoge">
<p id="fuga">SYNCER</p>
</div>
<script>
// compareDocumentPosition()
function myMethod () {
// div要素を取得
var element1 = document.getElementById( "hoge" ) ;
// p要素を取得
var element2 = document.getElementById( "fuga" ) ;
// メソッドを実行
var returnValue = element1.compareDocumentPosition( element2 ) ;
// 返り値を確認
console.log( "返り値", returnValue ) ;
// 位置関係をビット演算子で比較
console.log( "returnValue & DOCUMENT_POSITION_DISCONNECTED", (returnValue & Node.DOCUMENT_POSITION_DISCONNECTED) ) ;
console.log( "returnValue & DOCUMENT_POSITION_PRECEDING", (returnValue & Node.DOCUMENT_POSITION_PRECEDING) ) ;
console.log( "returnValue & DOCUMENT_POSITION_FOLLOWING", (returnValue & Node.DOCUMENT_POSITION_FOLLOWING) ) ;
console.log( "returnValue & DOCUMENT_POSITION_CONTAINS", (returnValue & Node.DOCUMENT_POSITION_CONTAINS) ) ;
console.log( "returnValue & DOCUMENT_POSITION_CONTAINED_BY", (returnValue & Node.DOCUMENT_POSITION_CONTAINED_BY) ) ;
console.log( "returnValue & DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", (returnValue & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC) ) ;
}
</script>
</body>
</html>
デモ
サポート状況
Node.compareDocumentPosition()のサポート状況です。
ブラウザ | サポート状況 | ブラウザ | サポート状況 |
---|---|---|---|
Chrome | Supported | Firefox | Supported |
Edge | Supported | Internet Explorer | Supported 9+ |
Safari | Supported | Opera | Supported |
iOS Safari | Supported | Android | Supported |
Chrome
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
57 | Supported | 2017年3月頃 | 0.1% |
56 | Supported | 2017年1月頃 | 12.02% |
55 | Supported | 2016年12月頃 | 12.36% |
54 | Supported | 2016年10月頃 | 0.44% |
53 | Supported | 2016年9月頃 | 0.25% |
52 | Supported | 2016年7月頃 | 0.27% |
51 | Supported | 2016年6月頃 | 0.4% |
50 | Supported | 2016年4月頃 | 0.32% |
49 | Supported | 2016年3月頃 | 0.47% |
48 | Supported | 2016年1月頃 | 0.02% |
47 | Supported | 2015年12月頃 | 0.06% |
46 | Supported | 2015年10月頃 | 0.56% |
45 | Supported | 2015年9月頃 | 0.01% |
44 | Supported | 2015年7月頃 | 0.83% |
43 | Supported | 2015年5月頃 | 0.05% |
42 | Supported | 2015年4月頃 | 0.05% |
41 | Supported | 2015年3月頃 | 0.01% |
40 | Supported | 2015年1月頃 | 0.59% |
39 | Supported | 2014年11月頃 | 0.02% |
38 | Supported | 2014年10月頃 | 0.08% |
37 | Supported | 2014年8月頃 | 0.01% |
36 | Supported | 2014年7月頃 | 0.01% |
35 | Supported | 2014年5月頃 | 0.01% |
34 | Supported | 2014年4月頃 | 0.14% |
33 | Supported | 2014年2月頃 | 0.01% |
32 | Supported | 2014年1月頃 | 0% |
31 | Supported | 2013年11月頃 | 0.01% |
30 | Supported | 2013年10月頃 | 0.03% |
29 | Supported | 2013年8月頃 | 0% |
28 | Supported | 2013年6月頃 | 0.03% |
27 | Supported | 2013年5月頃 | 0.01% |
26 | Supported | 2013年3月頃 | 0% |
25 | Supported | 2013年2月頃 | 0% |
24 | Supported | 2013年1月頃 | 0% |
23 | Supported | 2012年11月頃 | 0% |
22 | Supported | 2012年9月頃 | 0% |
21 | Supported | 2012年7月頃 | 0% |
20 | Supported | 2012年6月頃 | 0% |
19 | Supported | 2012年5月頃 | 0% |
18 | Supported | 2012年3月頃 | 0.01% |
17 | Supported | 2012年2月頃 | 0.01% |
16 | Supported | 2011年12月頃 | 0% |
15 | Supported | 2011年10月頃 | 0% |
14 | Supported | 2011年9月頃 | 0% |
Firefox
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
52 | Supported | 2017年3月頃 | 0.12% |
51 | Supported | 2017年1月頃 | 1.7% |
50 | Supported | 2016年11月頃 | 0.78% |
49 | Supported | 2016年9月頃 | 0.02% |
48 | Supported | 2016年8月頃 | 0.07% |
47 | Supported | 2016年6月頃 | 0.03% |
46 | Supported | 2016年4月頃 | 0.01% |
45 | Supported | 2016年3月頃 | 0.1% |
44 | Supported | 2016年1月頃 | 0.01% |
43 | Supported | 2015年12月頃 | 0.02% |
42 | Supported | 2015年11月頃 | 0.01% |
41 | Supported | 2015年9月頃 | 0% |
40 | Supported | 2015年8月頃 | 0.02% |
39 | Supported | 2015年7月頃 | 0.01% |
38 | Supported | 2015年5月頃 | 0.02% |
37 | Supported | 2015年3月頃 | 0% |
36 | Supported | 2015年2月頃 | 0.01% |
35 | Supported | 2015年1月頃 | 0% |
34 | Supported | 2014年12月頃 | 0.01% |
33 | Supported | 2014年10月頃 | 0% |
32 | Supported | 2014年9月頃 | 0% |
31 | Supported | 2014年7月頃 | 0.01% |
30 | Supported | 2014年6月頃 | 0% |
29 | Supported | 2014年4月頃 | 0% |
28 | Supported | 2014年3月頃 | 0.01% |
27 | Supported | 2014年2月頃 | 0% |
26 | Supported | 2013年12月頃 | 0% |
25 | Supported | 2013年10月頃 | 0% |
24 | Supported | 2013年9月頃 | 0% |
23 | Supported | 2013年8月頃 | 0% |
22 | Supported | 2013年6月頃 | 0% |
21 | Supported | 2013年5月頃 | 0% |
20 | Supported | 2013年4月頃 | 0% |
19 | Supported | 2013年2月頃 | 0% |
18 | Supported | 2013年1月頃 | 0% |
17 | Supported | 2012年11月頃 | 0% |
16 | Supported | 2012年10月頃 | 0% |
15 | Supported | 2012年8月頃 | 0% |
14 | Supported | 2012年7月頃 | 0% |
13 | Supported | 2012年6月頃 | 0% |
12 | Supported | 2012年4月頃 | 0% |
11 | Supported | 2012年3月頃 | 0% |
10 | Supported | 2012年1月頃 | 0% |
9 | Supported | 2011年12月頃 | 0% |
8 | Supported | 2011年11月頃 | 0% |
7 | Supported | 2011年9月頃 | 0% |
6 | Supported | 2011年8月頃 | 0% |
5 | Supported | 2011年6月頃 | 0% |
4 | Supported | 2011年3月頃 | 0% |
Edge
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
14 | Supported | 2016年2月頃 | 1.05% |
13 | Supported | 2015年9月頃 | 0.08% |
Internet Explorer
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
11 | Supported | 2013年10月頃 | 4.99% |
10 | Supported | 2012年8月頃 | 0.09% |
9 | Supported | 2011年3月頃 | 0.18% |
8 | Not Supported | 2009年3月頃 | 0.04% |
7 | Not Supported | 2006年10月頃 | 0.01% |
6 | Not Supported | 2001年8月頃 | 0% |
Safari
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
10 | Supported | 2016年10月頃 | 0% |
9.1 | Supported | 2015年9月頃 | 0% |
8.0 | Supported | 2014年10月頃 | 0% |
7.1 | Supported | 2013年10月頃 | 0% |
6.0 | Supported | 2012年7月頃 | 0% |
5.1 | Supported | 2011年7月頃 | 0% |
4 | Supported | 2009年6月頃 | 0% |
Opera
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
43 | Supported | 2017年2月頃 | 0.06% |
42 | Supported | 2016年12月頃 | 0.09% |
41 | Supported | 2016年10月頃 | 0.01% |
40 | Supported | 2016年9月頃 | 0% |
39 | Supported | 2016年8月頃 | 0% |
38 | Supported | 2016年6月頃 | 0% |
37 | Supported | 2016年5月頃 | 0.01% |
36 | Supported | 2016年3月頃 | 0.01% |
35 | Supported | 2016年2月頃 | 0% |
34 | Supported | 2015年12月頃 | 0% |
33 | Supported | 2015年10月頃 | 0% |
32 | Supported | 2015年9月頃 | 0% |
31 | Supported | 2015年8月頃 | 0% |
30 | Supported | 2015年6月頃 | 0% |
29 | Supported | 2015年4月頃 | 0% |
28 | Supported | 2015年3月頃 | 0% |
27 | Supported | 2015年1月頃 | 0% |
26 | Supported | 2014年12月頃 | 0% |
25 | Supported | 2014年10月頃 | 0% |
24 | Supported | 2014年9月頃 | 0% |
23 | Supported | 2014年7月頃 | 0% |
22 | Supported | 2014年6月頃 | 0% |
21 | Supported | 2014年5月頃 | 0.01% |
20 | Supported | 2014年3月頃 | 0% |
19 | Supported | 2014年1月頃 | 0% |
18 | Supported | 2013年11月頃 | 0% |
17 | Supported | 2013年10月頃 | 0% |
16 | Supported | 2013年8月頃 | 0% |
15 | Supported | 2013年7月頃 | 0% |
12 | Supported | 2012年6月頃 | 0.02% |
11.6 | Supported | 2011年12月頃 | 0% |
11.1 | Supported | 2011年4月頃 | 0% |
iOS Safari
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
10.0 | Supported | 2016年9月頃 | 39.65% |
9.1 | Supported | 2015年9月頃 | 5.39% |
8.3 | Supported | 2014年9月頃 | 1.03% |
7.0 | Supported | 2013年9月頃 | 0.24% |
6.0 | Supported | 2012年9月頃 | 0.05% |
5.1 | Supported | 2011年10月頃 | 0.03% |
Android
バージョン | サポート状況 | 公開時期 | シェア |
---|---|---|---|
4.4 | Supported | 2013年10月頃 | 0% |
4.3 | Supported | 2013年7月頃 | 0% |
4.2 | Supported | 2013年3月頃 | 0.03% |
4.1 | Supported | 2012年12月頃 | 0% |
4.0 | Supported | 2012年6月頃 | 1.61% |
2.3 | Supported | 2011年10月頃 | 0% |