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的文字滚动跑马灯插件(一个页面多个滚动区)
Jul 26 Javascript
javascript基础知识大集锦(一) 推荐收藏
Jan 13 Javascript
验证手机号码的JS方法分享
Sep 10 Javascript
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
javascript实现简单加载随机色方块
Dec 25 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
深入理解vue中的$set
Jun 01 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
Angular 组件之间的交互的示例代码
Mar 24 Javascript
javascript实现日历效果
Jun 17 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 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字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
玩转python爬虫之正则表达式
2016/02/17 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
python中的decorator的作用详解
2018/07/26 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
学习演讲稿范文
2014/05/10 职场文书
读书之星事迹材料
2014/05/12 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python
Python实现制作销售数据可视化看板详解
2021/11/27 Python
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS