2011-01-31 10 views
6

Creo que esto debería ser un problema fácil, pero por desgracia me encuentro atascado. Lo que estoy tratando de hacer es configurar una forma para que cada vez que haga clic en una celda en una tabla (o en cualquier otro lugar), se muestre el parentNode de cada elemento, básicamente atravesando el árbol DOM. Pensé que necesitaría usar elem.parentNode, pero estoy atrapado en la parte transversal. Cualquier gurú por ahí que pueda ayudarme, sería muy apreciado.Recorriendo el árbol DOM para mostrar información sobre el parentNode

Respuesta

10
var element; //your clicked element 
while(element.parentNode) { 
    //display, log or do what you want with element 
    element = element.parentNode; 
} 
+1

Gracias por la ayuda. Pregunta rápida, ¿por qué usar element.parentNode en lugar de element? – NinjaCode

+0

Cada elemento en DOM tiene su 'parentNode' - excluyendo el nodo raíz, que es' Document'. Entonces iteras sobre el elemento por tanto tiempo, ya que el elemento tiene un 'parentNode'. En el cuerpo 'while' usted asigna los elementos actuales' parentNode' a la variable del elemento, por lo que podría ejecutarse una y otra vez hasta que llegue a 'Document' que no tiene' parentNode'. – singles

3
var tables = document.getElementsByTagName('table'); 
for (var i=0,len=tables.length;i<len;++i){ 
    tables[i].onclick = function(evt){ 
    if (!evt) evt = window.event; 
    var element = evt.target || evt.srcElement; 
    while (element){ 
     console.log(element); 
     element = element.parentNode; 
    } 
    }; 
} 

Si realmente quiere hacer clic en cualquier elemento en todas partes, entonces simplemente:

document.body.onclick = function(evt){ 
    if (!evt) evt = window.event; 
    var element = evt.target || evt.srcElement; 
    while (element){ 
    console.log(element); 
    element = element.parentNode; 
    } 
}; 
+0

pensé hasta hoy que las propiedades de evento como '' currentTarget' y target' no estaban disponibles en el IE . Parece que solo tienen primos en IE, como con varias otras propiedades. Gracias por la visión. –

+0

+1 y un buen trabajo al llegar a 10k – qwertymk

+0

'getElementsByTagName' devuelve un objeto, no una matriz, por lo que necesitará usar' Array.prototype.method.call' o [crear una matriz falsa] (http://stackoverflow.com/ questions/4513162/document-getelementsbytagname-return-value) para iterarlo correctamente. – rxgx

Cuestiones relacionadas