加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

contains和compareDocumentPosition 确定是否HTML节点间的相关

发布时间:2018-09-07 02:58:16 所属栏目:创业 来源:站长网
导读:一个很棒的 blog 文章,是 PPK 两年前写的,文章中表明白 contains() 和 compareDocumentPosition() 要领运行在他们各自的赏识器上。从那起,我已经对这些要领做了大量的研究,而且已经在许多场所行使他们。在许多使命中,他们被证明长短常有效的(出格关
副问题[/!--empirenews.page--]

一个很棒的 blog 文章,是 PPK 两年前写的,文章中表明白 contains() 和 compareDocumentPosition() 要领运行在他们各自的赏识器上。从那起,我已经对这些要领做了大量的研究,而且已经在许多场所行使他们。在许多使命中,他们被证明长短常有效的(出格关于布局的抽象 DOM 选择器)。

1、DOMElement.contains(DOMNode)

这个要领起先用在 IE ,用来确定 DOM Node 是否包括在另一个 DOM Element 中。

当实行优化 CSS 选择器遍历(像:“#id1 #id2”),这个要领很有效。你可以通过 getElementById 获得元素,然后行使 .contains() 确定 #id1 现实上是否包括 #id2。

留意点:假如 DOM Node 和 DOM Element 相同等,.contains() 将返回 true ,固然,一个元素不能包括本身。

这里有一个简朴的执行包装,可以运行在:Internet Explorer, Firefox, Opera, and Safari。 

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com] function contains(a, b) {
return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(arg) & 16);
}

2、NodeA.compareDocumentPosition(NodeB)

这个要领是 DOM Level 3 specification 的一部门,应承你确定 2 个 DOM Node 之间的彼此位置。这个要领比 .contains() 强盛。这个要领的一个也许应用是排序 DOM Node 成一个具体准确的次序。

行使这个要领你可以确定关于一个元素位置的陆续串的信息。全部的这些信息将返回一个比特码(Bit,比特,亦称二进制位)。

对付那些,人们知之甚少。比特码是将多重数据存储为一个简朴的数字(译者注:0 或 1)。你最终打开 / 封锁个体数量(译者注:打开/封锁对应 0 /1),将给你一个最终的功效。

这里是从 NodeA.compareDocumentPosition(NodeB) 返回的功效,包括你可以获得的信息。

Bits Number Meaning
000000 0 元素同等
000001 1 节点在差异的文档(可能一个在文档之外)
000010 2 节点 B 在节点 A 之前
000100 4 节点 A 在节点 B 之前
001000 8 节点 B 包括节点 A
010000 16 节点 A 包括节点 B
100000 32 赏识器的私有行使

此刻,这意味着一个也许的功效相同于:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com] <div id="a">
<div id="b"></div>
</div>
<script>
alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>

一旦一个节点 A 包括另一个节点 B,包括 B(+16) 且在 B 之前(+4),则最后的功效是数字 20 。假如你查察比特产生的变革,将增进你的领略。

000100 (4) + 010000 (16) = 010100 (20)

这个,毫无疑问,有助于领略单个最紊乱的 DOM API 要领。虽然,他的代价当之无愧的。

此刻,DOMNode.compareDocumentPosition 在 Firefox 和 Opera 中是可用的。然而,有一些能力,我们可以用来在 IE 中执行他。

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com] // Compare Position - MIT Licensed, John Resig
function comparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains ?
( a != b && a.contains(b) && 16 ) +
( a != b && b.contains(a) && 8 ) +
( a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex < b.sourceIndex && 4 ) +
(a.sourceIndex > b.sourceIndex && 2 ) :
1 ) :
0;
}

IE 提供应我们一些可以行使的要领和属性。开始,行使 .contains() 要领(如我们前面所接头的),以便给我们包括(+16)可能被包括(+8)的功效。IE 尚有一个 .sourceIndex 属性在全部的 DOM Element 对应着元素在文档中的位置,譬喻:document.documentElement.sourceIndex == 0。由于我们有这个信息,我们可以完成两个 compareDocumentPosition 困难:在前面(+2)和在后头(+4)。其它,假如一个元素不在当前的文档,.sourceIndex 将便是 -1,这个给我们其它一个答复(+1)。最后,通过这个进程的揣度,我们可以确定假如一个元素便是他自己,返回一个空的比特码(+0)。

这个函数可以在 Internet Explorer、Firefox 和 Opera 中运行。但在 Safari 中却有残破成果(由于他只有 contains() 要领,而没有 .sourceIndex 属性。我们只能获得 包括(+16),被包括(+8),其他的全部功效都将返回(+1)代表一个断开)。

PPK 提供了一个关于通过建设一个 getElementsByTagNames 要领使新成果可以被行使的很棒的例子。让我们改编他到我们的新要领中:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com] // Original by PPK quirksmode.org
function getElementsByTagNames(list, elem) {
elem = elem || document;
var tagNames = list.split(’,’), results = [];
for ( var i = 0; i < tagNames.length; i++ ) {
var tags = elem.getElementsByTagName( tagNames[i] );
for ( var j = 0; j < tags.length; j++ )
results.push( tags[j] );
}

return results.sort(function(a, b){
return 3 - (comparePosition(a, b) & 6);
});
}

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读