Javascript 递归地穿过阴影和灯光
我试图递归地遍历阴影和灯光DOM(查找第一个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){
输入
,无论它在哪里)。这似乎不是一项很难的任务,所以我编写了以下代码
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)
中使用第一个孩子,但这不是无限循环的原因。