发现实际项目中经常需要判断一个节点是否是另一个节点的子节点,google了一下以及在做富文本的时候顺便看了下mozilla的api文档,发现个compareDocumentPosition方法,可用来比较两个节点位置。ie则有更好用的方法contains,只要传入的节点是其子孙节点就返回true。 more
compareDocumentPosition的返回值的说明如下(来自杂之学):
/*
* compareDocumentPosition: 属于 DOM Level 3 Core
* referrer: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition
* value: 返回值(返回 otherNode 与 node 相比较的结果):
* DOCUMENT_POSITION_DISCONNECTED = 0x01;
* DOCUMENT_POSITION_PRECEDING = 0x02; // 前面
* DOCUMENT_POSITION_FOLLOWING = 0x04; // 后面
* DOCUMENT_POSITION_CONTAINS = 0x08; // 包含
* DOCUMENT_POSITION_CONTAINED_BY = 0x10; // 被包含
* 可能值(组合值):
* 00000000: 同一节点 (0x00|0)
* 00000001: 不在同一文档中 (0x01|1)
* 00010100: otherNode 为 node 的后代节点 (0x14|20)
* 00001010: otherNode 为 node 的祖先节点 (0x0A|10)
* 00000100: otherNode 在 node 后面 (0x04|4)
* 00000010: otherNode 在 node 前面 (0x02|2)
*/
因此封装了下面一个方法,用在了webqq的富文本和自定义的mouseenter和mouseleave事件
/**
* 判断一个节点是否是某个父节点的子节点,
* 默认不包含parent === child的情况
* @param {HTMLElement} parent
* @param {HTMLElement} child
* @param {Boolean} containSelf 指示是否可包含parent等于child的情况
* @return {Boolean} 包含则返回true
*/
var contains = function(parent, child, containSelf){
if(!containSelf && parent === child){
return false;
}
if(parent.compareDocumentPosition){//w3c
var res = parent.compareDocumentPosition(child);
if(res === 20){
return true;
}
}else{
if(parent.contains(child)){//ie
return true;
}
}
return false;
};
参考:
不错哦,请求转载:<a href='http://bbs.ajaxjs.com/forum.php?mod=viewthread&tid=3764&page=1&extra=#pid10557' rel='nofollow noopener'>http://bbs.ajaxjs.com/forum...</a>