我的意思是他们的一系列。这是从顶级HTML到目标元素的链,包括元素本身。
例如对于元素<A>
,它将是:
[HTML, BODY, DIV, DIV, P, SPAN, A]
答案 0 :(得分:33)
稍短(更安全,因为target
可能找不到):
var a = document.getElementById("target");
var els = [];
while (a) {
els.unshift(a);
a = a.parentNode;
}
答案 1 :(得分:19)
您可以尝试以下内容:
var nodes = [];
var element = document.getElementById('yourelement');
nodes.push(element);
while(element.parentNode) {
nodes.unshift(element.parentNode);
element = element.parentNode;
}
答案 2 :(得分:3)
这样的事情:
var nodeList = [document.getElementById('element')];
while (nodeList[nodeList.length - 1].parentNode !== document) {
nodeList.unshift(nodeList[nodeList.length - 1].parentNode);
}
答案 3 :(得分:1)
另一种选择(基于this)
for(var e = document.getElementById("target"),p = [];e && e !== document;e = e.parentNode)
p.push(e);
答案 4 :(得分: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。
答案 5 :(得分:0)
我喜欢这种方法:
[...(function*(e){do { yield e; } while (e = e.parentNode);})($0)]
...其中$ 0是您的元素。
该方法的一个优点是它可以用作表达式中的值。
答案 6 :(得分:0)
获取javascript数组中子节点的所有父节点
let selectedTxtElement = document.getElementById("target");
let els = [];
while (selectedTxtElement) {
els.unshift(selectedTxtElement);
selectedTxtElement = selectedTxtElement.parentNode;
}