比方说,我有一个div
,称为Z .
Z that is a sub-sub-sub... child of a
div called
B which is a child of a
div called
A`。
从B
到Z
的所有块均设置为display=none
(可见A
)。
如果我单击链接到块Z
的锚点,则希望显示它。
为此,我需要设置块Z block
的显示,还需要设置其父对象的显示*以阻止,并且将其父对象一直设置到块B。...
我不想对所有可能的级别进行“硬性”编码,因为我可能有2、4或10个级别。因此,我想找到一种自动执行此操作的方法。
我简化了上面的示例,因为我必须每两“代”设置一次display=block
(请参见我的代码parentNode.parentNode
)
到目前为止,这是我的代码(在兔子洞下面2级!),而不是自动化:
function indexLink(link_to_anchor) {
var x = document.getElementById(link_to_anchor);
if (x.parentNode.parentNode.getAttribute("class") == "divcodebox") {
if (x.parentNode.parentNode.parentNode.parentNode.getAttribute("class") == "divcodebox") {
x.parentNode.parentNode.parentNode.parentNode.style.display = "block";
}
x.parentNode.parentNode.style.display = "block";
}
x.style.display = "block";
}
递归使用indexLink():
function indexLink(link_to_anchor) {
var x = document.getElementById(link_to_anchor);
x.style.display = "block";
if (x.parentNode.parentNode.getAttribute("class") == "divcodebox") {
x.parentNode.parentNode.style.display = "block";
indexLink(x)
}
}
答案 0 :(得分:1)
一个简单的for
循环怎么样?
var x = document.getElementById(link_to_anchor);
for (parent = x.parentNode; parent; parent = parent.parentNode) {
// do whatever
}
您当然可以保留一个计数器来检查您遍历了多少步,等等。.parentNode
级别的document
引用将是null
,这样就可以结束迭代。 (您也可以提早退出循环。)
答案 1 :(得分:1)
这只是根据代码而不是完整的示例来展示递归函数的外观。
;function indexLink(element){
//REM: Change the parameter to the actual element instead of its id
//var x = document.getElementById(link_to_anchor);
//REM: Check if the element exists and the style does not equal block
//REM: If the styles are set by class you need to change this to computed style
if(element && element.style.display !== 'block'){
//REM: Set the display to block
element.style.display = 'block';
//REM: Repeating the same logic for the parentNode
indexLink(element.parentNode)
}
};
答案 2 :(得分:0)
function recursiveApply(from, to, fn) {
let current = from;
while(current !== to) {
fn(current);
current = current.parentElement;
}
}
然后像这样使用它:
var a = document.getElementById("1");
var b = document.getElementById("2");
recursiveApply(a, b, function(element) {
// do stuff with the element
console.log(element)
});