2014-04-12 15 views
2

雖然我讀過關於這個問題的很多職位嵌套的childNodes的文本,我無法得到期望的結果。
我的目標是在純JavaScript中獲取嵌套子節點的文本。 與此代碼獲取JavaScript

function GetChildNodes() { 
    var container = document.getElementById ("find"); 
    for (var i = 0; i < container.childNodes.length; i++) { 
     var child = container.childNodes[i]; 
     if (child.nodeType == 3) { 
      var str=child.nodeValue 
      console.log(str) 
     } 
     else { 
      if (child.nodeType == 1) { 
       var str=child.childNodes[0].nodeValue 
       console.log(str)       
      } 
     } 
    } 
} 

GetChildNodes() 

我可以得到文本,如果HTML是

<div id="find"> 
    aaa 
    <div>aaa</div> 
    <div>aaa</div> 
    <div>aaa</div> 
    <div>aaa</div> 
</div> 

但是像這樣

<div id="find"> 
    aaa 
    <div>aaa<div>bbb</div></div> 
    <div>aaa<div>bbb</div></div> 
    <div>aaa</div> 
    <div>aaa</div> 
</div> 

HTML代碼...是錯誤的。
您能否給我一個解決方案?

回答

2

如果您不需要獲取文本節點到節點,你可以得到所有的它與node.textContent祖先,

var str = document.getElementById('find').textContent; 
console.log(str); 

否則,你需要遍歷或通過遞歸DOM樹尋找節點類型3和訪問.data.childNodes否則,如遞歸

function getText(node) { 
    function recursor(n) { 
     var i, a = []; 
     if (n.nodeType !== 3) { 
      if (n.childNodes) 
       for (i = 0; i < n.childNodes.length; ++i) 
        a = a.concat(recursor(n.childNodes[i])); 
     } else 
      a.push(n.data); 
     return a; 
    } 
    return recursor(node); 
} 
// then 
console.log(getText(document.getElementById('find'))); 
+0

:我知道也許我要求太多,但如何將我去反正改變的標記,包含b,文本的文本感謝你的代碼是真棒? – Devima

+0

而不是返回'n.data',回'N'這樣你就可以循環再用你的測試/動作,或執行上'N'立即 –

+0

你的行動:再次感謝你和你的想法,我可以這樣解決: 函數GetChildNodes(容器)var child = container.childNodes [i];函數返回值(容器){var i = 0; i - 1){child.nodeValue = '某些其他文本'} \t \t \t \t \t} } \t} \t recursor(容器) } var container = document.getElementById(「find」); GetChildNodes(容器) – Devima

0

這是因爲您只檢查findchildNodes,而不是子節點的子節點,並且它繼續。

沒有限制孩子的一個元素可以有許多,所以你應該每次或遞歸函數有for循環。

爲什麼你不只是做:document.getElementById('find').textContent;

0

因爲我的目的也是爲了
感謝這樣

<script type="text/javascript"> 
function GetChildNodes (container) { 
    function recursor(container){ 
      for (var i = 0; i < container.childNodes.length; i++) { 
       var child = container.childNodes[i]; 
       if(child.nodeType !== 3&&child.childNodes){ 
        recursor(child); 
       }else{ 
        var str=child.nodeValue; 
        if(str.indexOf('bbb')>-1){child.nodeValue='some other text'}; 
        }; 
      }; 
    }; 
    recursor(container); 
}; 
var container = document.getElementById ("find"); 
GetChildNodes(container); 
</script> 
改變嵌套元素的文本,如果文字是等於一個字符串,來的 Paul S 的意見,我可以解決我的問題

再次感謝保羅!