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 相关文章推荐
页面中iframe相互传值传参
Dec 13 Javascript
js 中 document.createEvent的用法
Aug 29 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
微信小程序的tab选项卡的实现效果
May 15 Javascript
对Layer弹窗使用及返回数据接收的实例详解
Sep 26 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
Aug 28 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随机数生成代码与使用实例分析
2011/04/08 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
PHP递归的三种常用方式
2019/02/28 PHP
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
小程序实现tab标签页
2020/11/16 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
Python映射拆分操作符用法实例
2015/05/19 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
python和c语言哪个更适合初学者
2020/06/22 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
数据库方面面试题
2012/04/22 面试题
茶叶生产计划书
2014/01/10 职场文书
渡河少年教学反思
2014/02/12 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
大学生干部培训心得体会
2016/01/06 职场文书