2012-01-04 34 views

回答

30

短一些(和更安全,因爲target可能無法找到):

var a = document.getElementById("target"); 
var els = []; 
while (a) { 
    els.unshift(a); 
    a = a.parentNode; 
} 
+5

我改變了接受的答案。這是最優雅的。 (順便說一句,測試表明,推動,然後反向更有效。)[我希望有一個選項可以接受多個答案,即使以我的分數爲代價。] – rsk82 2012-01-04 16:11:24

+0

這將包括文檔節點。如果你想停在'HTML'元素,那麼將'a = a.parentNode'改爲'a = a.parentElement' – 2017-09-08 15:06:07

16

你可以嘗試這樣的:

var nodes = []; 
var element = document.getElementById('yourelement'); 
nodes.push(element); 
while(element.parentNode) { 
    nodes.unshift(element.parentNode); 
    element = element.parentNode; 
} 
+1

啊,打我吧。 +1 – 2012-01-04 15:22:57

+4

+1。但是不是在最後使用'reverse()',而是使用'unshift()'而不是'push()' – 2012-01-04 15:23:22

+0

是的,不是在最後使用反轉,而是使用unshift成爲一種更有效的方法。回答編輯。 – techfoobar 2012-01-04 15:25:59

3

類似這樣的:

var nodeList = [document.getElementById('element')]; 
while (nodeList[nodeList.length - 1].parentNode !== document) { 
    nodeList.unshift(nodeList[nodeList.length - 1].parentNode); 
} 
0

我相信這將有可能從長遠來看最高效的在大多數情況下,如果你正在此功能的頻繁使用。 t爲什麼會更高性能的原因是因爲它最初會檢查它可能遇到的血統的深度。另外,不是每次調用它時都創建一個新的數組,而是該函數將高效地重用相同的數組,並對其進行分片,並在一些瀏覽器中對其進行優化。但是,由於我沒有真正有效的方法來檢查最大深度,所以我剩下的查詢選擇器檢查效率較低。

// !IMPORTANT! When moving this coding snippet over to your production code, 
// do not run the following depthtest more than once, it is not very performant 
var kCurSelector="*|*", curDepth=3; 
while (document.body.querySelector(kCurSelector += '>*|*')) curDepth++; 
curDepth = Math.pow(2, Math.ceil(Math.log2(startDepth))), 
var parentsTMP = new Array(curDepth); 

function getAllParentNodes(Ele){ 
    var curPos = curDepth; 

    if (Ele instanceof Node) 
     while (Ele !== document){ 
     if (curPos === 0){ 
      curPos += curDepth; 
      parentsTMP.length <<= 1; 
      parentsTMP.copyWithin(curDepth, 0, curDepth); 
      curDepth <<= 1; 
     } 
     parentsTMP[--curPos] = Ele; 
     Ele = Ele.parentNode; 
     } 
    return retArray.slice(curPos) 
} 

上述功能的瀏覽器兼容性是它可以在Edge中工作,但不能在IE中工作。如果你想要IE支持,那麼你將需要一個Array.prototype.copyWithin polyfill。

相關問題