2011-01-31 12 views
6

Tôi cảm thấy đây phải là một vấn đề dễ dàng, nhưng than ôi tôi thấy mình bị mắc kẹt. Những gì tôi đang cố gắng làm là thiết lập một cách để mỗi khi bạn nhấp vào một ô trên bảng (hoặc bất kỳ đâu), nó sẽ hiển thị parentNode của mỗi phần tử, về cơ bản đi qua cây DOM. Tôi figured tôi sẽ cần phải sử dụng elem.parentNode, nhưng tôi bị mắc kẹt trên một phần đi qua. Bất kỳ bậc thầy nào ngoài kia có thể giúp tôi, nó sẽ được đánh giá cao.Traversing lên cây DOM để hiển thị thông tin về parentNode

Trả lời

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

Cảm ơn sự giúp đỡ. Tuy nhiên, câu hỏi nhanh, tại sao lại sử dụng element.parentNode thay vì phần tử? – NinjaCode

+0

Mỗi phần tử trong DOM có 'parentNode' - không bao gồm nút gốc, là' Document'. Vì vậy, bạn lặp qua phần tử càng lâu, vì phần tử có một 'parentNode'. Trong phần tử 'while' bạn gán các phần tử hiện tại' parentNode' vào biến phần tử, vì vậy nó có thể chạy và bật cho đến khi nó đạt đến 'Tài liệu' không có' 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; 
    } 
    }; 
} 

Nếu bạn thực sự muốn nhấp vào bất kỳ yếu tố ở khắp mọi nơi, sau đó chỉ cần:

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

tôi nghĩ đến ngày hôm nay rằng các tính chất sự kiện như 'currentTarget' và 'là target' không có sẵn trong IE . Dường như họ chỉ có người anh em họ trong IE, giống như với nhiều tài sản khác. Cảm ơn vì sự thấu hiểu. –

+0

+1 và công việc tốt khi đạt 10k – qwertymk

+0

'getElementsByTagName' trả về một đối tượng không phải là một mảng vì vậy sẽ cần sử dụng' Array.prototype.method.call' hoặc [tạo mảng giả] (http://stackoverflow.com/ câu hỏi/4513162/document-getelementsbytagname-return-value) để lặp lại nó một cách chính xác. – rxgx

Các vấn đề liên quan