2010-03-16 9 views
1

Ma question est exactement celle-ci mais dans le contexte je veux examiner l'objet de sélection, comparer le anchorNode et le focusNode et s'ils sont différents, alors trouver le premier élément parent commun.Quelle est la meilleure façon de trouver le premier parent commun de deux nœuds DOM en javascript?

var selected = window.getSelection(); 
var anchor = selection.anchorNode; 
var focus = selection.focusNode; 

if (anchor != focus) { 
    // find common parent... 
} 

Répondre

5

Je voudrais essayer quelque chose comme ça, en supposant qu'aucune bibliothèque JS:

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); 
} 

à l'aide des utilitaires:

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; 
    }; 
} 

Ensuite, vous pouvez appeler findFirstCommonAncestor(myElementA, myElementB).

+0

Merci pour la version gratuite de la bibliothèque si vous avez tous deux été d'une grande aide! – roborourke

1

De cette façon est assez simple:

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

boucle à travers le parents() d'un élément et voir si elles sont contenues dans le parents() de l'autre en utilisant jusqu'à ce que vous trouviez un match (ou non) .

+0

Très bien rangé - je dois obtenir des jquery le cas dans ce projet, à commencer à regarder la peine maintenant . – roborourke

+0

@sanchothefat oh mon dieu, désolé pour une raison quelconque, je pensais que votre question était liée à jQuery. – cletus

+0

Pas de soucis. À peu près tous les javascript sont jquery liés ces jours-ci (ou devraient être) – roborourke

1

// Il semble que ce devrait être assez simple, même sans une bibliothèque ou 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; 
} 
}