2016-07-27 57 views
-1

我正在尝试学习ES2015,并且遇到了小函数的问题,我必须解析某个DOM元素并查找所有textnodes并将其删除。for ...在js中的声明 - 与dom集合的问题

而且我在循环语句中有简单的这个函数。

function deleteTextNodes(element) { 
    if(!element) { 
     throw new Error ("Element doesn't exist") 
    } 
for (let i = 0; i < element.childNodes.length; i ++) { 
    if (element.childNodes[i].nodeType == 3) { 
     element.removeChild(element.childNodes[i]); 
     i--; 
    } else if(element.childNodes[i].nodeType == 1) { 
     deleteTextNodes(element.childNodes[i]) 
    } 
} 

而且我尝试重写功能在...上声明的语法如下

function deleteTextNodes(element) { 
if(!element) { 
    throw new Error ("Element doesn't exist") 
} 
for(elem of element.childNodes) { 
    console.log(elem, elem.nodeType,); 
    if (elem.nodeType == 3) { 
     element.removeChild(elem); 
    } else if(elem.nodeType == 1) { 
     deleteTextNodes(elem) 
    } 
} 
return true 

}

可能,第二个功能工作正常,除了一个 - 为...上跳过去删除textnode之后的下一个节点或类似的东西。我解决这个问题,第一个功能加入i--;

所以,问题是如何解决这个问题在第二个功能?

+4

尝试'Array.from(element.childNodes)' –

+0

@ArtyomNeustroev Thx U,它的工作原理! – elektrobober

+0

*可能*表示什么?你有没有尝试过? – Bergi

回答

0

只是一个替代建议,因为范围与ES6玩弄:

function deleteTextNodes(element) { 
    if(!element) { 
     throw new Error ("Element doesn't exist") 
    } 
    let coll = [element]; 
    while(coll.length){ 
    [{nodeType:nt}] = ([element,...coll] = coll); 
    if (nt == 3) { 
     element.remove(); 
    } else if(nt == 1) { 
     coll.push(...element.childNodes); 
    } 
    } 
} 

这避免了需要递归通过不断添加的childNodes到集合。 [element,...coll] = coll将第一个元素分配给元素var,并将剩余的集合分配给coll。 不一定更好,但它显示了解构的一些很好的元素。

0
function deleteTextNodes(element) { 
    if (!element) { 
    throw new Error("Element doesn't exist") 
    } 
    let removeElement = []; 
    for (elem of element.childNodes) { 
    if (elem.nodeType == 3) { 
     removeElement.push(elem); 
    } else if (elem.nodeType == 1) { 
     deleteTextNodes(elem) 
    } 
    } 
    removeElement.forEach(elem =>elem.remove()); 
    return true 
}