JS:如何根据需要自动执行“ parentNode”上移次数

时间:2019-05-08 13:57:36

标签: javascript function parent-node

比方说,我有一个div,称为Z . Z that is a sub-sub-sub... child of a div called B which is a child of a div called A`。

BZ的所有块均设置为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)
    }
}

3 个答案:

答案 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)
});