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 相关文章推荐
一个javascript参数的小问题
Mar 02 Javascript
Extjs中常用表单介绍与应用
Jun 07 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
Feb 08 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
Jul 15 Javascript
vue中的ref和$refs的使用
Nov 22 Javascript
JavaScript简易计算器制作
Jan 17 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 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中使用XML
2006/10/09 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
Python在线运行代码助手
2016/07/15 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
逻辑链路控制协议
2016/10/01 面试题
结构工程个人自荐信范文
2013/11/30 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
材料加工工程求职信
2014/02/19 职场文书
报效祖国演讲稿
2014/09/15 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
八年级英语教学计划
2015/01/23 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
python基础入门之字典和集合
2021/06/13 Python
python turtle绘图命令及案例
2021/11/23 Python
nginx日志格式分析和修改
2022/04/28 Servers
python如何读取和存储dict()与.json格式文件
2022/06/25 Python
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS