ÐÑли еÑÑÑ Ð´Ð²Ð° ÑлеменÑа, Ñо иногда бÑÐ²Ð°ÐµÑ Ð½Ñжно понÑÑÑ, Ð»ÐµÐ¶Ð¸Ñ Ð»Ð¸ один из Ð½Ð¸Ñ Ð²ÑÑе дÑÑгого, Ñо еÑÑÑ ÑвлÑеÑÑÑ Ð»Ð¸ его пÑедком.
ÐбÑÑнÑе поиÑковÑе меÑÐ¾Ð´Ñ Ð·Ð´ÐµÑÑ Ð½Ðµ даÑÑ Ð¾ÑвеÑа, но еÑÑÑ Ð´Ð²Ð° ÑпеÑиалÑнÑÑ . Ðни иÑполÑзÑÑÑÑÑ Ñедко, но когда Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа вÑÑаÑÑ, Ñо знание меÑода Ð¼Ð¾Ð¶ÐµÑ ÑÑкономиÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑÑÑок кода.
ÐеÑод contains Ð´Ð»Ñ Ð¿ÑовеÑки на вложенноÑÑÑ
СинÑакÑиÑ:
var result = parent.contains(child);
ÐозвÑаÑÐ°ÐµÑ true, еÑли parent ÑодеÑÐ¶Ð¸Ñ child или parent == child.
ÐеÑод compareDocumentPosition Ð´Ð»Ñ Ð¿Ð¾ÑÑдка Ñзлов
ÐÑваеÑ, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð´Ð²Ð° ÑлеменÑа, к пÑимеÑÑ, <li> в ÑпиÑке, и нÑжно понÑÑÑ, какой из ниÑ
вÑÑе дÑÑгого.
ÐеÑод compareDocumentPosition â более моÑнÑй, Ñем contains, он пÑедоÑÑавлÑÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно инÑоÑмаÑÐ¸Ñ Ð¸ о ÑодеÑжании и об оÑноÑиÑелÑном поÑÑдке ÑлеменÑов.
СинÑакÑиÑ:
var result = nodeA.compareDocumentPosition(nodeB);
ÐозвÑаÑаемое знаÑение â биÑÐ¾Ð²Ð°Ñ Ð¼Ð°Ñка (Ñм. ÐобиÑовÑе опеÑаÑоÑÑ), биÑÑ Ð² коÑоÑой ознаÑаÑÑ ÑледÑÑÑее:
| ÐиÑÑ | ЧиÑло | ÐнаÑение |
|---|---|---|
| 000000 | 0 | nodeA и nodeB -- один и ÑÐ¾Ñ Ð¶Ðµ Ñзел |
| 000001 | 1 | Ð£Ð·Ð»Ñ Ð² ÑазнÑÑ Ð´Ð¾ÐºÑменÑÐ°Ñ (или один из Ð½Ð¸Ñ Ð½Ðµ в докÑменÑе) |
| 000010 | 2 | nodeB пÑедÑеÑÑвÑÐµÑ nodeA (в поÑÑдке обÑ
ода докÑменÑа) |
| 000100 | 4 | nodeA пÑедÑеÑÑвÑÐµÑ nodeB |
| 001000 | 8 | nodeB ÑодеÑÐ¶Ð¸Ñ nodeA |
| 010000 | 16 | nodeA ÑодеÑÐ¶Ð¸Ñ nodeB |
| 100000 | 32 | ÐаÑезеÑвиÑовано Ð´Ð»Ñ Ð±ÑаÑзеÑа |
ÐонÑÑие «пÑедÑеÑÑвÑеÑ» â ознаÑÐ°ÐµÑ Ð½Ðµ ÑолÑко «пÑедÑдÑÑий ÑоÑед пÑи обÑем ÑодиÑеле», но и Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÐµÐµ обÑий ÑмÑÑл: "ÑанÑÑе вÑÑÑеÑаеÑÑÑ Ð² поÑÑдке пÑÑмого Ð¾Ð±Ñ Ð¾Ð´Ð° деÑева докÑменÑа.
ÐогÑÑ Ð±ÑÑÑ Ð¸ ÑоÑеÑÐ°Ð½Ð¸Ñ Ð±Ð¸Ñов. ÐÑимеÑÑ ÑеалÑнÑÑ Ð·Ð½Ð°Ñений:
<p>...</p>
<ul>
<li>1.1</li>
</ul>
<script>
var p = document.body.children[0];
var ul = document.body.children[1];
var li = ul.children[0];
// 1. <ul> наÑ
одиÑÑÑ Ð¿Ð¾Ñле <p>
alert( ul.compareDocumentPosition(p) ); // 2 = 10
// 2. <p> наÑ
одиÑÑÑ Ð´Ð¾ <ul>
alert( p.compareDocumentPosition(ul) ); // 4 = 100
// 3. <ul> ÑодиÑÐµÐ»Ñ <li>
alert( ul.compareDocumentPosition(li) ); // 20 = 10100
// 4. <ul> поÑомок <body>
alert( ul.compareDocumentPosition(document.body) ); // 10 = 1010
</script>
Ðолее подÑобно:
- Ð£Ð·Ð»Ñ Ð½Ðµ Ð²Ð»Ð¾Ð¶ÐµÐ½Ñ Ð¾Ð´Ð¸Ð½ в дÑÑгой, поÑÑÐ¾Ð¼Ñ ÑÑÐ¾Ð¸Ñ ÑолÑко Ð±Ð¸Ñ Â«Ð¿ÑедÑеÑÑвованиÑ», оÑÑÑда
10. - То же Ñамое, но обÑаÑнÑй поÑÑдок Ñзлов, поÑÑомÑ
100. - ÐдеÑÑ ÑÑоÑÑ ÑÑÐ°Ð·Ñ Ð´Ð²Ð° биÑа:
10100ознаÑаеÑ, ÑÑоulодновÑеменно ÑодеÑжиÑliи ÑвлÑеÑÑÑ ÐµÐ³Ð¾ пÑедÑеÑÑвенником, Ñо еÑÑÑ Ð¿Ñи пÑÑмом Ð¾Ð±Ñ Ð¾Ð´Ðµ деÑева докÑменÑа ÑнаÑала вÑÑÑеÑаеÑÑÑul, а поÑомli. - ÐналогиÑно пÑедÑдÑÑемÑ,
1010ознаÑаеÑ, ÑÑоdocument.bodyÑодеÑжиÑulи пÑедÑеÑÑвÑÐµÑ ÐµÐ¼Ñ.
СамÑй пÑоÑÑой ÑпоÑоб ÑамоÑÑоÑÑелÑно поÑмоÑÑеÑÑ, как ÑиÑло вÑглÑÐ´Ð¸Ñ Ð² 2-ной ÑиÑÑеме â вÑзваÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ toString(2), напÑимеÑ:
var x = 20;
alert( x.toString(2) ); // "10100"
Ðли Ñак:
alert( 20..toString(2) );
ÐдеÑÑ Ð¿Ð¾Ñле 20 две ÑоÑки, Ñак как еÑли одна, Ñо JS подÑмаеÑ, ÑÑо поÑле Ð½ÐµÑ Ð´ÐµÑÑÑиÑÐ½Ð°Ñ ÑаÑÑÑ â бÑÐ´ÐµÑ Ð¾Ñибка.
ÐÑовеÑиÑÑ ÐºÐ¾Ð½ÐºÑеÑное ÑÑловие, напÑимеÑ, «nodeA ÑодеÑÐ¶Ð¸Ñ nodeB», можно пÑи помоÑи биÑовÑÑ
опеÑаÑий, в данном ÑлÑÑае: nodeA.compareDocumentPosition(nodeB) & 16, напÑимеÑ:
<ul>
<li>1</li>
</ul>
<script>
var body = document.body;
var li = document.body.children[0].children[0];
if (body.compareDocumentPosition(li) & 16) {
alert( body + ' ÑодеÑÐ¶Ð¸Ñ ' + li );
}
</script>
Ðолее подÑобно о биÑовÑÑ Ð¼Ð°ÑÐºÐ°Ñ : ÐобиÑовÑе опеÑаÑоÑÑ.
ÐоддеÑжка в IE8-
Ð IE8- поддеÑживаÑÑÑÑ Ñвои, неÑÑандаÑÑнÑе, меÑод и ÑвойÑÑво:
- nodeA.contains(nodeB)
- РезÑлÑÑаÑ:
true, еÑлиnodeAÑодеÑжиÑnodeB, а Ñакже в Ñом ÑлÑÑае, еÑлиnodeA == nodeB. - node.sourceIndex
- ÐÐ¾Ð¼ÐµÑ ÑлеменÑа
nodeв поÑÑдке пÑÑмого Ð¾Ð±Ñ Ð¾Ð´Ð° деÑева. ТолÑко Ð´Ð»Ñ Ñзлов-ÑлеменÑов.
Ðа иÑ
оÑнове можно напиÑаÑÑ Ð¿Ð¾Ð»Ð¸Ñил Ð´Ð»Ñ compareDocumentPosition:
// код Ñ http://compatibility.shwups-cms.ch/en/polyfills/?&id=82
(function() {
var el = document.documentElement;
if (!el.compareDocumentPosition && el.sourceIndex !== undefined) {
Element.prototype.compareDocumentPosition = function(other) {
return (this != other && this.contains(other) && 16) +
(this != other && other.contains(this) && 8) +
(this.sourceIndex >= 0 && other.sourceIndex >= 0 ?
(this.sourceIndex < other.sourceIndex && 4) +
(this.sourceIndex > other.sourceIndex && 2) : 1
) + 0;
}
}
}());
С ÑÑим полиÑилом меÑод доÑÑÑпен Ð´Ð»Ñ ÑлеменÑов во вÑÐµÑ Ð±ÑаÑзеÑÐ°Ñ .
ÐÑого
- ÐÐ»Ñ Ð¿ÑовеÑки, ÑвлÑеÑÑÑ Ð»Ð¸ один Ñзел пÑедком дÑÑгого, доÑÑаÑоÑно меÑода
nodeA.contains(nodeB). - ÐÐ»Ñ ÑаÑÑиÑенной пÑовеÑки на пÑедÑеÑÑвование еÑÑÑ Ð¼ÐµÑод
compareDocumentPosition. - ÐÐ»Ñ IE8 нÑжен полиÑил длÑ
compareDocumentPosition.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)