2011年12月22日星期四

Node.contains

/*
 code ref  http://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583523.html
 IE有contains方法。如果A元素包含B元素,则返回true,否则false。唯一不支持这个方法的是firefox。
 不过火狐支持compareDocumentPosition() 方法,这是W3C制定的方法,标准浏览器都支持。
 它的使用形式与contains差不多,但返回的不是一个布尔值,而是一个很奇怪的数值,它是通过如下方式累加计算出来的:
 二进制   数值 含义
 000000 0    元素一致
 000001 1    节点在不同的文档(或者一个在文档之外)
 000010 2    节点 B 在节点 A 之前
 000100 4    节点 A 在节点 B 之前
 001000 8    节点 B 包含节点 A
 010000 16   节点 A 包含节点 B
 100000 32    浏览器的私有使用
 A.compareDocumentPosition(B);//B与A不相连,B在A的后面,B被A包含 4+16 = 20
 B.compareDocumentPosition(A);//A与B不相连,A在B的前面,A包含B 2+8 = 10
 */
//PPK给出如下解决方法。
if (window.Node && Node.prototype && !Node.prototype.contains) {
    Node.prototype.contains = function (arg) {
        return !!(this.compareDocumentPosition(arg) & 16);//位运算 小于16结果为0
    }
} 
//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;
}

没有评论:

发表评论