contains与compareDocumentPosition方法详解
来源:互联网 发布:matlab 网络仿真 编辑:程序博客网 时间:2024/05/16 11:57
1. nodeA .contains( nodeB ):
000001 1 节点在不同的文档(或者一个在文档之外)
000010 2 节点 B 在节点 A 之前
000100 4 节点 A 在节点 B 之前
001000 8 节点 B 包含节点 A
010000 16 节点 A 包含节点 B
100000 32 浏览器的私有使用
这个方法起先用在 IE ,用来确定 nodeB 是否包含在另一个 nodeA 中。
注意点:如果 nodeA 和 nodeB 相一致,.contains() 将返回 true ,虽然,一个元素不能包含自己。
2、nodeA.compareDocumentPosition(nodeB):
这个方法这个方法是 DOM Level 3 specification 的一部分,比contains方法强大得多,可以比较两个元素的相对位置,返回结果如下:
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 浏览器的私有使用
对于第一列代表的意思,可能很多同学以前不太了解,比特码可以将多个状态按位存储成一个数字,而多个状态是相互独立的,例如:
<div id="a">
<div id="b"></div>
</div>
<script>
alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>
<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)
3.contains和compareDocumentPosition各浏览器差异:
IE6/7/8
IE9
Firefox
Safari
Chrome
Opera
contains
Y
Y
N
Y
Y
Y
compareDocumentPosition
N
Y
Y
Y
Y
Y
4.兼容IE的compareDocumentPosition实现:
// 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;
}
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;
}
5.应用:
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");
http://msdn.microsoft.com/en-us/library/ms536377%28VS.85%29.aspx
https://developer.mozilla.org/En/DOM/Node.compareDocumentPosition
http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition
http://ejohn.org/blog/comparing-document-position/
- contains与compareDocumentPosition方法详解
- contains与compareDocumentPosition方法详解
- contains与compareDocumentPosition方法详解
- 判断元素之间的包含关系contains和compareDocumentPosition详解
- contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
- contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
- contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
- contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
- contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
- 39. Element compareDocumentPosition() 方法
- contains、compareDocumentPosition判断元素位置关系
- contains和compareDocumentPosition 的用法及区别
- contains( )方法
- Node.compareDocumentPosition
- .Net 相等性:集合类 Contains 方法详解
- ArrayList的Contains方法
- HashSet的contains方法
- List的contains()方法
- 为AIX更新技术级别和服务包
- linux shell 指令好记速查
- Memcached命令列表(二)
- 杭电ACM题目分类
- 犯二的Xcode 之 Could not launch app - No such file or directory 错误
- contains与compareDocumentPosition方法详解
- windows下添加mysql服务
- Mini2440触摸屏程序分析
- More Effective C++读书笔记5
- android神奇的“FileNotFoundException”
- android in practice_create model、table class and sqlitehelper(MyMoviesDataBases project)
- 利用遮照实现弹出框---JS
- aspcms常见问题解决方案
- Eclipse 断点调试