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 相关文章推荐
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
封装了一个支持匿名函数的Javascript事件监听器
Jun 05 Javascript
JSON相关知识汇总
Jul 03 Javascript
Bootstrap表单布局
Jul 19 Javascript
Js获取当前日期时间及格式化代码
Sep 17 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
vue中如何让子组件修改父组件数据
Jun 14 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
Sep 05 jQuery
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
Postman内建变量常用方法实例解析
Jul 28 Javascript
在vue中配置不同的代理同时访问不同的后台操作
Sep 11 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
Bootstrap实现模态框效果
2019/09/30 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python随机生成指定长度密码的方法
2015/04/04 Python
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
女大学生自我鉴定
2013/12/09 职场文书
模具数控专业自荐信
2014/01/27 职场文书
个人函授自我鉴定
2014/03/25 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
个人催款函范文
2015/06/23 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript