Non ha molto senso chiamare apply su un istanza, visto che sovrascrive l'oggetto this: normalmente lo si invoca sul metodo del prototipo del costruttore. Così:
codice:
Array.prototype.push.apply(textNodes, getTextNodesIn(children[i]));
In ogni caso il tuo approccio è davvero contorto. Io farei così:
codice:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Documento HTML</title>
<script type="text/javascript">
function populateTextCollection (aCollection, oTarget) {
if (oTarget.hasChildNodes()) {
for (var oNode = oTarget.firstChild; oNode; oNode = oNode.nextSibling) {
populateTextCollection(aCollection, oNode);
}
} else if (oTarget.nodeType === 3) {
aCollection.push(oTarget);
}
}
/* Quello che segue e' solo un test: */
onload = function() {
var aTextNodes = [];
populateTextCollection(aTextNodes, document.getElementById("lipsum"));
alert(aTextNodes);
}
</script>
</head>
<body>
<div id="lipsum">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum mattis mauris, at imperdiet nulla imperdiet vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus in sem vel nisl dictum rutrum. Nulla facilisi. In hac habitasse platea dictumst. Cras rhoncus, mi lacinia iaculis tempus, augue neque tincidunt nibh, id venenatis lacus odio eu sapien. Aliquam nisi nisl, consequat sit amet aliquam mattis, aliquam sit amet tellus. Donec at felis quis ipsum vestibulum commodo eu eu magna. Sed porttitor varius dolor, vel venenatis magna interdum porta. Nulla massa nibh, molestie a accumsan auctor, pulvinar ut eros. Nulla sagittis, lorem molestie aliquam tristique, dolor quam cursus orci, at blandit sapien mauris ut mauris.</p>
Donec iaculis faucibus odio, ut placerat nisi porttitor id. <span style="text-decoration: underline;">Morbi ut tempor erat. Morbi auctor iaculis magna, non feugiat felis euismod quis. Morbi aliquet urna felis. Vestibulum erat eros, gravida semper iaculis sit amet</span>, iaculis nec erat. Quisque a libero mi. Phasellus leo velit, interdum at adipiscing eget, dignissim quis dui. Nam tellus libero, adipiscing ac mattis nec, congue id felis. Nulla facilisi. Nulla vel tortor suscipit enim facilisis interdum.</p>
</div>
</body>
</html>
Se vuoi applicare un filtro sui nodi di testo vuoti, sostituisci la riga 12 con:
codice:
} else if (oTarget.nodeType === 3 && oTarget.nodeValue.trim()) {
Se invece dell'oggetto nodo di testo quel che vuoi salvarti è il suo contenuto, sostituisci la riga 13 con:
codice:
aCollection.push(oTarget.nodeValue);
Piccola nota filosofica. Passare un'object reference da popolare invece che sfruttare il return di una funzione ricorsiva è un paradigma di programmazione vicino al C e all'uso dei puntatori e lontano dalla programmazione orientata agli oggetti tipica di JavaScript. Ma non a caso il C è il linguaggio più performante dopo l'assembly