2012-01-31 148 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

相关问题