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