博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
contains 和 ele.compareDocumentPosition确定html节点间的关系
阅读量:7028 次
发布时间:2019-06-28

本文共 2674 字,大约阅读时间需要 8 分钟。

 

~~~ nodeA.contains(nodeB) //ie ,   nodeA.compareDocumentPosition(nodeB) //firefox opera

    1、DOMElement.contains(DOMNode)

    这个方法起先用在 IE ,用来确定 DOM Node 是否包含在另一个 DOM Element 中。

    注意点:如果 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)。

    这里是从 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             浏览器的私有使用

 

    现在,这意味着一个可能的结果类似于:

 

 <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)

    现在,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")

转载地址:http://oklxl.baihongyu.com/

你可能感兴趣的文章
【MySql】复制出现Slave_SQL_Running: No 错误解决
查看>>
Linux命令学习总结:shutdown
查看>>
[xmlpull]XmlPull常见错误
查看>>
IE7下元素的 'padding-top' 遇到 'clear' 特性在某些情况下复制到 'padding-bottom'
查看>>
(二十一)java字符串替换的问题
查看>>
面向服务编程
查看>>
虚拟化平台cloudstack(5)——参考资料
查看>>
Codeforces Round #309 (Div. 2) B. Ohana Cleans Up
查看>>
用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
查看>>
android Recyclerview仿京东,滚动屏幕标题栏渐变(启动页面动画)
查看>>
C语言之数值计算--级数算法
查看>>
C++之引用
查看>>
MFC学习笔记之三(粒子系统+怪物简单AI+碰撞检测)
查看>>
ios xmpp研究探索:发送文本消息
查看>>
费用流模板
查看>>
Makefile规则详解
查看>>
明星讲师心石闪耀ArchSummit大会 | 手机淘宝构架演化实践
查看>>
【Android开发】网路编程及Internet应用-从指定网站上下载文件
查看>>
PHP7源码笔记一
查看>>
扩展欧几里得算法求方程特解
查看>>