Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归地穿过阴影和灯光_Javascript_Html_Dom_Shadow Dom - Fatal编程技术网

Javascript 递归地穿过阴影和灯光

Javascript 递归地穿过阴影和灯光,javascript,html,dom,shadow-dom,Javascript,Html,Dom,Shadow Dom,我试图递归地遍历阴影和灯光DOM(查找第一个输入,无论它在哪里)。这似乎不是一项很难的任务,所以我编写了以下代码 recursiveWalk: function(node, func) { var done = func(node); if(done){ return true; } if('root' in node){ this.recursiveWalk(node.root, func); if(done){

我试图递归地遍历阴影和灯光DOM(查找第一个
输入
,无论它在哪里)。这似乎不是一项很难的任务,所以我编写了以下代码

recursiveWalk: function(node, func) {
    var done = func(node);
    if(done){
        return true;
    }

    if('root' in node){
        this.recursiveWalk(node.root, func);
        if(done){
            return true;
        }
    }

    node = node.firstChild;
    while (node) {
        var done = this.recursiveWalk(node, func);
        if(done){
            return true;
        }
        node = node.nextSibling;
    }
}

由于我无法理解的原因(我猜这与以下事实有关:在光DOM中的元素可以在阴影DOM中找到,但阴影DOM中的元素不必在光DOM中,但不是每个元素都有阴影DOM…所以我被卡住了)

解决方案是等待聚合物准备就绪:

document.addEventListener('polymer-ready', function() {
    recursiveWalk(document.body, function (node) {
        console.log(node.nodeName);
    });
})
要使用shadowDom属性,请执行以下操作:

if ('shadowRoot' in node &&  node.shadowRoot) {
    var done = recursiveWalk(node.shadowRoot, func);
    if (done) {
       return true;
    }
}

函数结束时返回true,因为存在这样的情况:done永远不会为true,为什么使用node.firstChild和than node.nextSibling?你要迭代孩子们还是兄弟姐妹们?@jan:这会导致它在阴影上进行递归漫游时完成整个函数,当func返回时,它只应返回true,当func返回时,它应返回true;当漫游未找到任何内容时,它应不返回任何内容。@jan:
firstChild
下降一级,然后
nextSibling
继续探索该级别,通过
this.recursiveWalk
深入每个元素。好的,当您从第一个孩子开始时,您在开始时失去了一些兄弟姐妹,最好从第一个兄弟姐妹开始,并在
this.recursiveWalk(node.firstChild,func)
中使用第一个孩子,但这不是无限循环的原因。