`

javascript contains和compareDocumentPosition 方法来确定是否HTML节点

阅读更多

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。

 

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 
000 0 元素一致 
001 1 节点在不同的文档(或者一个在文档之外) 
010 2 节点 B 在节点 A 之前 
100 4 节点 A 在节点 B 之前 
000 8 节点 B 包含节点 A 
000 16 节点 A 包含节点 B 
000 32 浏览器的私有使用 
现在,这意味着一个可能的结果类似于:

 

<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 。如果你查看比特发生的变化,将增加你的理解。 
100 (4) + 010000 (16) = 010100 (20) 
这个,毫无疑问,有助于理解单个最混乱的 DOM API 方法。当然,他的价值当之无愧的。 
现在,DOMNode.compareDocumentPosition 在 Firefox 和 Opera 中是可用的。然而,有一些技巧,我们可以用来在 IE 中执行他。

 

// 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 方法使新功能可以被使用的很棒的例子。让我们改编他到我们的新方法中:

 

// 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); 
}); 
} 

 

我们现在可以使用他来按次序构建一个站点的目录: 
getElementsByTagNames("h1, h2, h3"); 
虽然 Firefox 和 Opera 都采取了一些主动落实这一方法。我依然期待看到更多的浏览器进入,以帮助向前推动

分享到:
评论

相关推荐

    javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系

    在探究HTML节点间的关系时,JavaScript 提供了两个实用的方法,即 `contains()` 和 `compareDocumentPosition()`。这两个方法在不同浏览器中的实现和使用略有差异,但都能有效地帮助开发者确定节点间的结构关系。...

    contains和compareDocumentPosition 方法来确定是否HTML节点间的关系

    `contains()` 和 `compareDocumentPosition()` 是JavaScript中用于解决这一问题的关键方法。本文将深入探讨这两个方法,以及它们在不同浏览器中的实现。 首先,`DOMElement.contains(DOMNode)` 方法主要用来检查一...

    js contains方法实现代码

    代码示例中还展示了如何使用这些方法进行测试,即创建父元素和子元素,并分别使用自定义的contains方法以及compareDocumentPosition方法来验证它们之间的包含关系。 总而言之,由于浏览器间的兼容性问题,开发者...

    javascript 常用DomAPI总结

    - **Node.contains(node)**: 返回一个布尔值,表示参数节点是否为当前节点的后代节点。 - **Node.compareDocumentPosition(node)**: 返回一个 7 个比特位的二进制值,表示参数节点和当前节点的关系。 - **Node....

    document.contains:用于`document.contains'的Polyfillshim

    如果没有,它就会定义一个新的`contains`方法,这个方法通过调用`compareDocumentPosition`来判断两个节点的关系。`compareDocumentPosition`返回一个位掩码,其中16表示节点A是节点B的后裔。因此,当`...

    javascript中mouseover、mouseout使用详解

    3. 为了提高性能,可以使用compareDocumentPosition或contains方法来优化子元素与父元素之间的包含关系判断。这些方法可以避免遍历父元素带来的性能问题。使用这些DOM属性或方法可以快速判断一个元素是否为另一个...

    跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明

    在IE浏览器中,我们可以使用`parentNode.contains(childNode)`来判断childNode是否是parentNode的子节点,但这个方法在非IE浏览器中不通用。因此,对于跨浏览器的解决方案,我们可以使用`!!(node1....

    javascript比较文档位置

    主要涉及两个方法:`contains()`和`compareDocumentPosition()`。 1、`DOMElement.contains(DOMNode)`: 这个方法最初由IE引入,用于判断一个DOM Node是否在另一个DOM Element内部。在优化CSS选择器遍历,如查找`#...

    JavaScript和JQuery的鼠标mouse事件冒泡处理

    而在JQuery 1.7版本之后引入了`.on()`和`.off()`方法来绑定和解除事件处理器,通过第三个参数可以控制是否在事件处理函数中调用`e.stopPropagation()`。 通过文档中提供的示例代码,我们可以看到`stopPropagation()...

    jQuery中使用了document和window哪些属性和方法小结

    这些对象提供了丰富的属性和方法,使得JavaScript能够更好地与网页内容进行交互。虽然`document.getElementById()`和`object.addEventListener()`等常见方法在此处未被提及,但以下是一些在jQuery中常用的`document`...

Global site tag (gtag.js) - Google Analytics