11.4.3 contains() 方法

 用来确定某个节点是不是另一个节点的后代。 注:a.contains(a) 也是返回true。说明contains方法搜索是从自身开始的。

 DOM Level 3 的 compareDocumentPosition() 也可以确定节点间的关系。 返回一个表示该关系的位掩码。

    1  无关

    2  居前

    4  居后

    8  包含

    16  被包含 

因为compareDocumentPosition返回的是一个位掩码,所以必须再使用按位与运算才能得到有意义的值。 

来看个例子:

 var result = document.documentElement.compareDocumentPosition(document.body);

 alert(!!(result & 16));

运行上面代码, reslut的值为20(20 = 16[被包含] + 4[居后]),其实我也不理解为甚是这样的。。。(什么时候自己到了看js源码的季节,就懂得了,加油)然后双感叹号即为双重非, 利用了非操作符会有一个默认的将操作值变为布尔值的类型转换。

同理 var result =document.body.compareDocumentPosition(document.documentElement); 此时result为10 = 8[包含] + 2[居前]。

function contains(refNode, otherNode){
    if(typeof refNode.contains == "function" &&
        (!client.engine.webkit || client.engine.webkit >= 522)){
        return refNode.contains (otherNode);
      }else if(typeof refNode.compareDocumentPosition == "function"){    
        return !!(refNode.compareDocumentPosition(otherNode));}else{
     var node = otherNode.parentNode;
     do {
                if(node === refNode){
                    return true;
                }else{
                   node = node.parentNode;
              }
       } while( node != null);
      return false;
}