javascript contains方法

IE有许多好用的方法,后来都被其他浏览器抄袭了,比如这个contains方法。如果A元素包含B元素,则返回true,否则false。唯一不支持这个方法的是IE的死对头firefox。

<!doctype html> <title>dom contains 方法 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="dom contains 方法 by 司徒正美" /> <meta name="description" content="dom contains 方法 by 司徒正美" /> <mce:script type="text/javascript"><!-- window.onload = function(){ var A = document.getElementById('parent'), B = document.getElementById('child'); alert(A.contains(B)); alert(B.contains(A)); } // --></mce:script> <h2 style="text-align:center" mce_style="text-align:center">contains方法</h2> <div id="parent"> <p> <strong id="child" >本例子会在火狐中会报错。</strong> </p> </div>

不过火狐支持compareDocumentPosition() 方法,这是W3C制定的方法,标准浏览器都支持,不过实用性性很差,因此没有什么人用,推广不开来。它的使用形式与contains差不多,但返回的不是一个布尔值,而是一个很奇怪的数值,它是通过如下方式累加计算出来的:

BitsNumberMeaning
0000000元素一致
0000011节点在不同的文档(或者一个在文档之外)
0000102节点 B 在节点 A 之前
0001004节点 A 在节点 B 之前
0010008节点 B 包含节点 A
01000016节点 A 包含节点 B
100000 32浏览器的私有使用

<!doctype html> <title>dom contains 方法 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="dom contains方法 by 司徒正美" /> <meta name="description" content="dom contains方法 by 司徒正美" /> <mce:script type="text/javascript"><!-- window.onload = function(){ var A = document.getElementById('parent'), B = document.getElementById('child'); alert(A.compareDocumentPosition(B));//B与A不相连,B在A的后面,B被A包含 4+16 = 20 alert(B.compareDocumentPosition(A));//A与B不相连,A在B的前面,A包含B 2+8 = 10 } // --></mce:script> <h2 style="text-align:center" mce_style="text-align:center">compareDocumentPosition方法</h2> <div id="parent"> <p> <strong id="child" >本例子请在标准浏览器中运行。</strong> </p> </div>

//PPK给出如下解决方法。 if (window.Node && Node.prototype && !Node.prototype.contains){ Node.prototype.contains = function (arg) { return !!(this.compareDocumentPosition(arg) & 16) } } //我搞出个更短的: if(!!window.find){ HTMLElement.prototype.contains = function(B){ return this.compareDocumentPosition(B) - 19 > 0 } }

<!doctype html> <title>dom contains 方法 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="dom contains方法 by 司徒正美" /> <meta name="description" content="dom contains方法 by 司徒正美" /> <mce:script type="text/javascript"><!-- if(!!window.find){ HTMLElement.prototype.contains = function(B){ return this.compareDocumentPosition(B) - 19 > 0 } } window.onload = function(){ var A = document.getElementById('parent'), B = document.getElementById('child'); alert(A.contains(B)); alert(B.contains(A)); } // --></mce:script> <h2 style="text-align:center" mce_style="text-align:center">contains方法</h2> <div id="parent"> <p> <strong id="child" >contains方法</strong> </p> </div>

descendantOf: function(element, ancestor) { if (element.compareDocumentPosition) return (element.compareDocumentPosition(ancestor) & 8) === 8; if (ancestor.contains) return ancestor.contains(element) && ancestor !== element; while (element = element.parentNode) if (element == ancestor) return true; return false; },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值