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编写widget的一些技巧分享
Oct 28 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
js控制frameSet示例
Sep 10 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
Dec 19 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
谈谈Jquery中的children find 的区别有哪些
Oct 19 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
Vue导出json数据到Excel电子表格的示例
Dec 04 Javascript
React 组件渲染和更新的实现代码示例
Feb 21 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
Aug 03 Javascript
浅谈JavaScript 声明提升
Sep 14 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python算法学习之基数排序实例
2013/12/18 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Django框架 querySet功能解析
2019/09/04 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
python 实现汉诺塔游戏
2020/11/28 Python
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
为什么要用EJB
2014/04/17 面试题
团队精神演讲稿
2013/12/31 职场文书
产品促销活动策划书
2014/01/15 职场文书
小学清明节活动总结
2014/07/04 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL