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; }