2012-01-31 137 views
3
function countChars(elm) { 
    if (elm.nodeType == 3) { // TEXT_NODE 
     return elm.nodeValue.length; 
    } 
    var count = 0; 
    for (var i = 0, child; child = elm.childNodes[i]; i++) { 
     count += countChars(child); 
    } 
    return count; 
} 

我想通過這個函數的字符串像countChars("hello");但那不起作用。什麼是我可以傳遞的元素的例子?這個函數需要什麼樣的參數?

回答

5

它期待一個DOM節點的引用。這可以是一個文本節點(nodeType == 3)或一個元素節點(nodeType == 1)。例如:

countChars(document.getElementById("someId")); 

下面的HTML將導致上述調用返回5

<span id="someId">Hello</span> 

如果參數是函數返回字符組成該節點的數量文本節點。如果參數是元素節點,則該函數會遞歸計算組成元素的後代文本節點的字符數。

下面的HTML將導致上述調用返回10(包含子節點):

<div id="someId">Outer<span>inner</span></div> 

你可以看到node types on MDN的完整列表。

+0

1爲分銷商從特定的*元素節點*中拋出一個通用的* DOM節點*。 – 2012-01-31 20:29:57

+0

+1在此1分鐘內最準確和最具說明性。 :-) – JimmiTh 2012-01-31 20:33:32

3

該公司預計DOM節點,喜歡的事,你會從document.getElementById()或子節點的另一個DOM節點列表中獲得。

它能做什麼是發現元素的子節點列表中的所有文本節點,並計數有多少個字符包含。它以遞歸方式進行遞歸處理,因此無論元素圖中的分隔程度如何,它都會在容器中找到全部文本。

還應該注意,該代碼期望一個節點是文本節點或者一個元素。還有其他類型的節點,但最重要的是評論節點。

2

看起來你應該通過一個DOM元素。

2

的元素(節點,實際上,因此爲什麼它會檢查是否節點類型是一個文本節點),例如:

countChars(document.getElementById("myid")); 
1

你可以得到的nodeType在DOM片段,所以......你必須輸入一個DOM元素作爲輸入

https://developer.mozilla.org/en/nodeType

從該鏈接的例子顯示了它

var node = document.documentElement.firstChild; 
if(node.nodeType != Node.COMMENT_NODE) 
    alert("You should comment your code well!"); 
+0

請記住,IE不支持節點類型常量。我不確定節點對這個問題有什麼相關性。 – 2012-01-31 20:48:54

+0

作爲找出該函數的參數的方法的相關方法正好是nodeType屬性。主要是因爲OP沒有足夠好奇的看這個。所以COMMENT_NODE就是這裏的一個例子,就像你說的那樣是一個常數。深刻的想法是「檢查示例!」 – Alfabravo 2012-01-31 22:19:54

+0

我只是指出了一個事實,即如果將一個註釋節點傳遞給它,那麼這個函數可能會引發錯誤,所以它可能不是最好的例子!它不會在Internet Explorer中工作! – 2012-01-31 22:22:12

相關問題