关于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