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 相关文章推荐
Save a File Using a File Save Dialog Box
Jun 18 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
详解ES6中的let命令
Apr 05 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
vue.js之vue-cli脚手架的搭建详解
May 05 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
Aug 20 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
Apr 29 Javascript
Jquery Fade用法详解
Nov 06 jQuery
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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
php绘制圆形的方法
2015/01/24 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
使用requests库制作Python爬虫
2018/03/25 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python读取ini配置文件过程示范
2019/12/23 Python
pytorch 修改预训练model实例
2020/01/18 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
40岁生日感言
2014/02/15 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书