element.compareDocumentPosition() | 比较两个元素的文档位置。 |
function commonParentNode(oNode1, oNode2) { return oNode1.contains(oNode2) && oNode1 || commonParentNode(oNode1.parentNode,oNode2); }
}
function commonParentNode(oNode1, oNode2) { var parentList1 = [oNode1]; var parentList2 = [oNode2]; var position1 = 0; var position2 = 0; var resultNode ; while(resultNode === undefined){ var newNode; if(position1 <= position2){ newNode = parentList1[position1].parentNode; position1 += 1; for(let i =0;i<parentList2.length;i++){ if(parentList2[i]=== newNode){ resultNode = newNode; break; } } parentList1.push(newNode); } else { newNode = parentList2[position2].parentNode; position2 += 1; for(let i =0;i<parentList1.length;i++){ if(parentList1[i]=== newNode){ resultNode = newNode; break; } } parentList2.push(newNode); } } return resultNode; }
//递归 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)){ return oNode1; } else if(oNode2.contains(oNode1)){ return oNode2; } else{ return commonParentNode(oNode1.parentNode, oNode2); } } //循环 function commonParentNode(oNode1, oNode2) { for( ; oNode1; oNode1 = oNode1.parentNode){ if(oNode1.contains(oNode2)){ return oNode1; } } }
//三种情况 //1、oNode1为oNode2的最近父节点; //2、oNode2为oNode1的最近父节点; //3、oNode1和oNode2在同一层 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)) return oNode1; else if(oNode2.contains(oNode1)) return oNode2; else return oNode1.parentNode; }
function commonParentNode(oNode1, oNode2) { var parent1 = []; //用于存储包括oNode1的所有oNode1父节点 parent1.push(oNode1); while(oNode1.parentNode){ parent1.push(oNode1.parentNode); oNode1 = oNode1.parentNode; } while(oNode2){ for(var i in parent1){ if( parent1[i] == oNode2 ){ return oNode2; } } oNode2 = oNode2.parentNode; } return null; }
oNode1为全局变量 每次循环oNode1 = oNode1.parentNode
条件为oNode1.contains(oNode2)
满足条件就返回oNode1
function commonParentNode(oNode1, oNode2) { if(oNode1 === oNode2) return oNode1; if(oNode1.parentNode !== null) return commonParentNode(oNode1.parentNode, oNode2); if(oNode2.parentNode !== null) return commonParentNode(oNode1, oNode2.parentNode); }递归三行就写完了昂
function commonParentNode(oNode1, oNode2) { // 方法一: while(true) { oNode1 = oNode1.parentNode; if(oNode1.contains(oNode2)) { return oNode1; } } }
function commonParentNode(oNode1, oNode2) { // 方法二: if(oNode1.contains(oNode2)) { return oNode1; } else { // 递归 return commonParentNode(oNode1.parentNode, oNode2); } }