2010-03-16 72 views

回答

5

我会尝试这样的事情,假设没有JS库

function getAncestors(node) { 
    if(node != document) return [node].concat(getAncestors(node.parentNode)); 
    else return [node]; 
} 

if(Array.prototype.indexOf === undefined) { 
    Array.prototype.indexOf = function(element) { 
     for(var i=0, l=this.length; i<l; i++) { 
      if(this[i] == element) return i; 
     } 
     return -1; 
    }; 
} 

然后就可以调用findFirstCommonAncestor(myElementA, myElementB)

+0

感谢图书馆的免费版本,虽然你们都是一个很大的帮助! – roborourke 2010-03-16 11:26:45

1

这种方式相当简单:

var fp = $(focus).parents(); 
var ap = $(anchor).parents(); 
for (var i=0; i<ap.length; i++) { 
    if (fp.index(ap[i]) != -1) { 
    // common parent 
    } 
} 

遍历一个元素的parents()和使用,直到找到一个匹配(或不)查看它们是否包含在其他的parents() 。使用该实用程序

function findFirstCommonAncestor(nodeA, nodeB, ancestorsB) { 
    var ancestorsB = ancestorsB || getAncestors(nodeB); 
    if(ancestorsB.length == 0) return null; 
    else if(ancestorsB.indexOf(nodeA) > -1) return nodeA; 
    else if(nodeA == document) return null; 
    else return findFirstCommonAncestor(nodeA.parentNode, nodeB, ancestorsB); 
} 

+0

非常整洁 - 我可能会得到这个项目的情况下,一些jQuery的,开始寻找值得现在。 – roborourke 2010-03-16 11:27:35

+0

@sanchothefat哦,我的坏,由于某种原因抱歉,我认为你的问题是与jQuery相关的。 – cletus 2010-03-16 11:45:33

+0

不用担心。几乎所有的JavaScript都是jQuery相关的这些天(或应该是) – roborourke 2010-03-17 11:47:17

1

//现在看来似乎应该是相当简单的,即使没有图书馆或的indexOf

document.commonParent= function(a, b){ 
var pa= [], L; 
while(a){ 
    pa[pa.length]=a; 
    a= a.parentNode; 
} 
L=pa.length; 
while(b){ 
    for(var i=0; i<L; i++){ 
    if(pa[i]==b) return b; 
    } 
    b= b.parentNode; 
} 
} 
相关问题