递归地浏览Shadow和Light DOM

时间:2015-11-18 12:50:27

标签: javascript html dom shadow-dom

我试图以递归方式遍历阴影轻DOM(寻找第一个input,无论它在哪里)。这似乎不是一项艰巨的任务,所以我编写了以下代码

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 ......所以我被卡住了)。

1 个答案:

答案 0 :(得分:1)

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

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;
    }
}

http://jsfiddle.net/za1gn0pe/7/