firefox实现IE下的contains方法

  IE中dom对象的contains方法实现如果A元素包含B元素,则返回true,否则false。firefox不支持dom对象的contains方法。

 
<!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 司徒正美" />
<script type="text/javascript">
  window.onload = function(){
    var A = document.getElementById('parent'),
    B = document.getElementById('child');
    alert(A.contains(B));
    alert(B.contains(A));
  }
</script>
<h2 style="text-align:center">contains方法</h2>
<div id="parent">
  <p>
    <strong id="child" >本例子会在火狐中会报错。</strong>
  </p>
</div>

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

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 浏览器的私有使用
<!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 司徒正美" />
<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
  }
</script>
<h2 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 司徒正美" />
<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));
  }
</script>
<h2 style="text-align:center">contains方法</h2>
<div id="parent">
  <p>
    <strong id="child" >contains方法</strong>
  </p>
</div>

 

//2011.9.24 by 司徒正美
        var contains  = function(root, el) {
             if (root.compareDocumentPosition)
                 return root === el || !!(root.compareDocumentPosition(el) & 16);
             if (root.contains && el.nodeType === 1){
                 return root.contains(el) && root !== el;
             }
             while ((el = el.parentNode))
                 if (el === root) return true;
             return false;
         }
来源:http://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583523.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(118)喜欢(0)JavaScript/Ajax开发技巧