javascriptcontains和compareDocumentPosition方法来确定是否HTML节点间的关系
2023-06-13 09:14:16 时间
从那起,我已经对这些方法做了大量的研究,并且已经在很多场合使用他们。在很多任务中,他们被证明是非常有用的(特别关于结构的抽象DOM选择器)。
1、DOMElement.contains(DOMNode)
这个方法起先用在IE,用来确定DOMNode是否包含在另一个DOMElement中。
当尝试优化CSS选择器遍历(像:“#id1#id2”),这个方法很有用。你可以通过getElementById得到元素,然后使用.contains()确定#id1实际上是否包含#id2。
注意点:如果DOMNode和DOMElement相一致,.contains()将返回true,虽然,一个元素不能包含自己。
这里有一个简单的执行包装,可以运行在:InternetExplorer,Firefox,Opera,andSafari。
functioncontains(a,b){
returna.contains?a!=b&&a.contains(b):!!(a.compareDocumentPosition(arg)&16);
}
2、NodeA.compareDocumentPosition(NodeB)
这个方法是DOMLevel3specification的一部分,允许你确定2个DOMNode之间的相互位置。这个方法比.contains()强大。这个方法的一个可能应用是排序DOMNode成一个详细精确的顺序。
使用这个方法你可以确定关于一个元素位置的一连串的信息。所有的这些信息将返回一个比特码(Bit,比特,亦称二进制位)。
对于那些,人们知之甚少。比特码是将多重数据存储为一个简单的数字(译者注:0或1)。你最终打开/关闭个别数目(译者注:打开/关闭对应0/1),将给你一个最终的结果。
这里是从NodeA.compareDocumentPosition(NodeB)返回的结果,包含你可以得到的信息。
BitsNumberMeaning
0000元素一致
0011节点在不同的文档(或者一个在文档之外)
0102节点B在节点A之前
1004节点A在节点B之前
0008节点B包含节点A
00016节点A包含节点B
00032浏览器的私有使用
现在,这意味着一个可能的结果类似于:
<divid="a">
<divid="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)
这个,毫无疑问,有助于理解单个最混乱的DOMAPI方法。当然,他的价值当之无愧的。
现在,DOMNode.compareDocumentPosition在Firefox和Opera中是可用的。然而,有一些技巧,我们可以用来在IE中执行他。
//ComparePosition-MITLicensed,JohnResig
functioncomparePosition(a,b){
returna.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属性在所有的DOMElement对应着元素在文档中的位置,例如:document.documentElement.sourceIndex==0。因为我们有这个信息,我们可以完成两个compareDocumentPosition难题:在前面(+2)和在后面(+4)。另外,如果一个元素不在当前的文档,.sourceIndex将等于-1,这个给我们另外一个回答(+1)。最后,通过这个过程的推断,我们可以确定如果一个元素等于他本身,返回一个空的比特码(+0)。
这个函数可以在InternetExplorer、Firefox和Opera中运行。但在Safari中却有残缺功能(因为他只有contains()方法,而没有.sourceIndex属性。我们只能得到包含(+16),被包含(+8),其他的所有结果都将返回(+1)代表一个断开)。
PPK提供了一个关于通过创建一个getElementsByTagNames方法使新功能可以被使用的很棒的例子。让我们改编他到我们的新方法中:
//OriginalbyPPKquirksmode.org
functiongetElementsByTagNames(list,elem){
elem=elem||document;
vartagNames=list.split(","),results=[];
for(vari=0;i<tagNames.length;i++){
vartags=elem.getElementsByTagName(tagNames[i]);
for(varj=0;j<tags.length;j++)
results.push(tags[j]);
}
returnresults.sort(function(a,b){
return3-(comparePosition(a,b)&6);
});
}
我们现在可以使用他来按次序构建一个站点的目录:
getElementsByTagNames("h1,h2,h3");
虽然Firefox和Opera都采取了一些主动落实这一方法。我依然期待看到更多的浏览器进入,以帮助向前推动
相关文章
- java dom4j 查找_java dom4j根据条件读取查找xml节点的方法
- 【说站】js中removeat删除节点的方法
- iPAD越狱后下载激活成功教程版的pad软件方法总录[通俗易懂]
- java分割字符串的方法_java字符串按照特定字符分割
- typecho搬家后出现的一些问题解决方法
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
- 寻找两个链表相交节点方法(可以是有环链表)
- JS replaceChild()方法:替换节点
- 文件Linux查看HTML文件的简单方法(linux查看html)
- 利用Oracle递归查找子节点的简捷方法(oracle递归查询子节点)
- 在Ubuntu上安装Android-SDK的方法
- 解决MySQL56启动失败的方法(无法启动mysql56)
- 数据库Oracle关闭单节点数据库的方法(oracle 关闭单节点)
- MySQL上利用C语言编写的数据库操作方法(c 关于mysql的方法)
- C 语言中 MySQL 数据库求取平均值的实现方法(c mysql 平均值)
- javascript下查找父节点的简单方法
- PHPsetcookie()cannotmodifyheaderinformation的解决方法
- oracle执行cmd的实现方法
- javascriptFirefox与IE替换节点的方法
- 初学js插入节点appendChildinsertBefore使用方法
- HTTP错误500.19解决方法(定义了重复的节点)
- jquery添加节点的几种方法介绍
- C#将时间转成文件名使用方法
- Jquery节点遍历next与nextAll方法使用示例
- javascript动态修改Li节点值的方法
- jquery取子节点及当前节点属性值的方法
- jquery取子节点及当前节点属性值的方法
- C++实现寻找最低公共父节点的方法