2011-05-21 114 views
2

我使用的是火狐4 JS並獲得「太多的遞歸錯誤」,爲下面的代碼:太多的遞歸調用

extractText: function(domObj) { 
    if (domObj == null) { 
     return ""; 
    } else { 
     var acc = ""; 
     if (domObj.nodeType == Node.TEXT_NODE) { 
      acc += domObj.nodeValue; 
     } 
     if (domObj.hasChildNodes()) { 
      var children = currentObj.childNodes; 
      for (var i = 0; i < children.length; i++) { 
       acc += sui.extractText(children[i]); 
      } 
     } 
     return acc; 
    } 
    } 
}; 

有人嗎?

+2

「currentObj」和「sui」在哪裏定義? – Blender 2011-05-21 15:43:01

+0

這不是有效的Javascript。請張貼實際的測試用例。 – 2011-05-21 15:54:23

+0

currentObj是我的問題,錯誤的變量 - 愚蠢的我:-) – eve 2011-05-21 16:11:34

回答

3

我覺得這條線:

 var children = currentObj.childNodes; 

應該是:

 var children = domObj.childNodes; 

在我看來,就好像你提到「currentObj」在頂部重新開始,而不是從降元素正在檢查中。當然很難說,因爲你沒有包含「currentObj」的相關定義或初始化。

+0

我認爲你是對的。 – 2011-05-21 15:53:55

+0

嘿,那是對的!謝謝。然而,沒有我有一個不同的問題,並獲得不是文本的東西,如:#hdr-editions a {text-decoration:none; } #cnn_hdr-editionS {text-align:left; clear:both; } 任何人? #cnn_hdr-editionS {text-decoration:none; font-size:10px; top:7px; line-height:12px; font-weight:bold; } #hdr-prompt-text b {display:inline-block; margin:0 0 0 20px; } #hdr-editions li {padding:0 10px; } #hdr-editions ul li.no-pad-left span {font-size:12px; } .hdr-arrow-intl,.hdr-arrow-us,.hdr-arrow-us2 {left:148px; } .hdr-arrow-us2 {left:180px; } – eve 2011-05-21 22:00:10

+0

@eve這是另一個問題了...不要在評論中提問。但我確定這是因爲文檔中有嵌入式樣式......很難說,因爲您沒有在您的問題中提供相關代碼。 – Salketer 2015-10-06 12:43:32

0

您也可以嘗試一種迭代的方法,而不是遞歸的:

extractText: function(domObj) { 
    if (!(domObj instanceof Node)) return null; 
    var stack = [domObj], node, tf = []; 
    while (stack.length > 0) { 
     node = stack.pop(); 
     switch (node.nodeType) { 
     case Node.TEXT_NODE: 
      tf.push(node.nodeValue); 
      break; 
     case Node.ELEMENT_NODE: 
      for (var i=node.childNodes.length-1; i>=0; i--) 
       stack.push(node.childNodes[i]); 
      break; 
     } 
    } 
    return tf.join(""); 
} 

該算法使用堆棧仍然必須要訪問的節點實現depth first search。如果是Node instance,堆棧中的第一項是domObj。然後,對於堆棧中的每個節點:如果它是一個Text node,則將其值添加到文本片段數組tf;如果是Element node,則其子節點以相反的順序放置在堆棧上,以便第一個子節點位於堆棧頂部。重複這些步驟直到堆棧爲空。最後,使用數組的join方法將tf中的文本片段放在一起。