javascript比较文档位置


Posted in Javascript onApril 08, 2008

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

这个,毫无疑问,有助于理解单个最混乱的 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 相关文章推荐
js使用eval解析json(js中使用json)
Jan 17 Javascript
extJS中常用的4种Ajax异步提交方式
Mar 07 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
Jul 01 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
JavaScript订单操作小程序完整版
Jun 23 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
JS面试题大坑之隐式类型转换实例代码
Oct 14 Javascript
vue组件三大核心概念图文详解
May 30 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
Nov 12 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
Dec 09 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
js函数般调用正则
Apr 08 #Javascript
javascript背投广告代码的完善
Apr 08 #Javascript
大家未必知道的Js技巧收藏
Apr 07 #Javascript
用JavaScript调用WebService的示例
Apr 07 #Javascript
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 #Javascript
javascript add event remove event
Apr 07 #Javascript
JS动画效果代码3
Apr 03 #Javascript
You might like
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
JS 继承实例分析
2008/11/04 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
python for循环输入一个矩阵的实例
2018/11/14 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
为什么相对PHP黑python的更少
2020/06/21 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
自荐信结尾
2013/10/27 职场文书
销售会计岗位职责
2014/03/15 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
素质教育标语
2014/06/27 职场文书
超市创业计划书
2014/09/15 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android
SQL SERVER存储过程用法详解
2022/02/24 SQL Server