2016-07-27 62 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 
}