关于contains

contains, 判断节点的包含关系,大部分这类文章都说IE支持contains而FF不支持,FF需要用compareDocumentPosition方法,但据我现在测试,我的FF16已经支持contains了。

contains的实现有一个特殊的地方是他自己包含自己也被算是包含,而compareDocumentPosition则不包含自己。

故,假设要实现一个考虑充分的contains函数,则如下代码:

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

即给compareDocumentPosition在判断包含自身时也返回true。还考虑了当浏览器不支持compareDocumentPosition和contains时用遍历的方式来实现功能。但我个人觉得没有必要,因为应该还没有浏览器变态到不支持这两个方法的。

 

所以,可以简单点实现,按照个人理解,contains是判断节点是否包含某子节点,所以,不包含自身。代码如下:

var contains = function( root, el ){
    // 按照原则,先判断标准浏览器
    if( root.compareDocumentPosition ){
        return !!( root.compareDocumentPosition(el) & 16 );
    }else if( root.contains ){
        return root !== el && root.contains( el );
    }
    return false;
}

参考链接:

http://www.cnblogs.com/rubylouvre/archive/2011/05/30/1583523.html

https://github.com/chenmnkken/easyjs/blob/master/src/selector.js

posted @ 2012-10-17 01:11  肥杜  阅读(370)  评论(0编辑  收藏  举报