首页 > 试题广场 >

dom 节点查找

[编程题]dom 节点查找
  • 热度指数:56696 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
查找两个节点的最近的一个共同父节点,可以包括节点自身

输入描述:
oNode1 和 oNode2 在同一文档中,且不会为相同的节点

解题思路:

判断当前节点或第个节点与第二节点父节点是否相等:

oNode1 === oNode2 || oNode1 === oNode2.parentNode

这种情况下,返回:oNode1 。否则继续比较第一、二节点的父节点是否相等:

oNode1.parentNode === oNode2.parentNode

相等,可以返回 oNode1.parentNodeoNode2.parentNode,否则递归。

完整代码如下:

function commonParentNode(oNode1, oNode2) {
    return oNode1 === oNode2 || oNode1 === oNode2.parentNode ? oNode1 : 
        oNode1.parentNode === oNode2.parentNode ? oNode1.parentNode : 
        commonParentNode(oNode1, oNode2)
}
发表于 2021-04-19 10:09:19 回复(0)
3种结果,1包括2,2包括1,12不在一级
第三种情况时候直接递归调用就行了
发表于 2021-03-17 19:54:34 回复(0)
function commonParentNode(oNode1, oNode2) {
     while(!oNode1.contains(oNode2)){
         oNode1 = oNode1.parentNode;
     }
    
    return oNode1;
}
发表于 2021-01-10 10:35:07 回复(0)
考虑三种情况即可:一、 节点1和节点2是兄弟节点,共同的父亲节点就是他们的parentNode属性;二、节点1包含节点2,共同父节点就是节点1;三、节点2包含节点1,共同节点就是节点2。
function commonParentNode(oNode1, oNode2) {
    if(oNode1.parentNode == oNode2.parentNode||oNode2.parentNode==oNode1){
        return oNode1.parentNode
    };
    if(oNode1.parentNode==oNode2){
        return oNode2
    };
    return 0;
}


发表于 2021-01-08 20:05:29 回复(0)
没看讨论前还不知道contains这个函数,用了很蠢的方法,大体思路就是用两个父节点数组,新节点与另一个父节点数组比较。
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;
}

发表于 2020-03-10 01:20:04 回复(0)
function commonParentNode(oNode1, oNode2) {
    while(oNode1){
        if(oNode1.contains(oNode2)){
            return oNode1;
        }
        oNode1 = oNode1.parentNode
    }
}
发表于 2020-02-16 19:45:43 回复(0)
function commonParentNode(oNode1, oNode2) {
   
    for(;!oNode1.contains(oNode2);oNode1=oNode1.parentNode){
       
    }
     return oNode1
}
编辑于 2019-10-21 16:19:25 回复(0)
跟1楼的解法一致,题目比较明确,算法中不做过多的防御逻辑,contains这个方法是关键。
function commonParentNode(oNode1, oNode2) {
    while(oNode1){
        if(oNode1.contains(oNode2)){
            return oNode1;
        }
        oNode1 = oNode1.parentNode;
    }
}

发表于 2019-08-10 16:20:51 回复(0)
function commonParentNode(oNode1, oNode2) {     var curONode1Pr = oNode1          while(curONode1Pr) {         if(curONode1Pr.contains(oNode2)) return curONode1Pr         curONode1Pr = curONode1Pr.parentNode     }          return null }

发表于 2019-01-24 18:10:33 回复(0)
找了很久都没找到contains的官方用法说明(就找到一个jQuery的)
W3C的标准是
element.compareDocumentPosition() 比较两个元素的文档位置。
 function commonParentNode(oNode1, oNode2) {
    while(oNode1){
        var compare = oNode1.compareDocumentPosition(oNode2);
        if(compare ===10){  return oNode2;}
        if(compare ===20){  return oNode1; }
        oNode1=oNode1.parentNode;
    }
}
如果不想判断谁包含谁的话可以直接if(compare ===20||compare ===0){return oNode1; }
发表于 2017-10-14 19:57:51 回复(0)
function commonParentNode(oNode1, oNode2) {  var l1 = [], l2 = [];  for (; oNode1; oNode1 = oNode1.parentNode) l1.push(oNode1);  for (; oNode2; oNode2 = oNode2.parentNode) l2.push(oNode2);   var len1 = l1.length, len2 = l2.length;  for (var i = 0; i < len1 && i < len2; i++) {  if (l1[len1 - 1 - i] !== l2[len2 - 1 - i]) return l1[len1 - i];  }  return len1 > len2 ? l2[0] : l1[0]; }

发表于 2016-10-12 11:38:34 回复(0)
function commonParentNode(oNode1, oNode2) {
    if (oNode1 === oNode2) {
        return oNode1;
    } else {
        var parent = oNode1;
        while( parent = parent.parentNode ) {
            if (parent === oNode2) {
                return oNode2;
            }
        }
        return commonParentNode( oNode1 , oNode2.parentNode );
    }
}

发表于 2016-09-11 21:37:26 回复(0)
function commonParentNode(oNode1, oNode2) {
var parent1=oNode1.parentNode;
var parent2=oNode2.parentNode;
if(parent1===parent2){
console.log(parent1);
}
console.log(oNode1);
console.log(oNode2);
}
问下各位大神是不是用console.log()很low哈哈
发表于 2016-08-30 14:57:07 回复(0)

问题信息

难度:
14条回答 19380浏览

热门推荐

通过挑战的用户

查看代码
dom 节点查找