Poznajemy wzorzec array-closureHandler-loop (nazwa autora). Bardzo popularne podejście do rekurencyjnego rozwiązywania problemów w JS. Zaczynamy.

Oto lista z poprzedniego przykładu:

<ul id="myUl"><li><a href="">Text123</a></li></ul>

A oto poprzedni przykład (warunek bazowy):

function getTextNode(el){

    if(el === null)
        return null;
    
    if(el.nodeType === Node.TEXT_NODE)
        return el;

    return getTextNode(el.childNodes[0]);
}

Ok, teraz nasza lista będzie wyglądać tak:

<ul id="myUl">
        <li><a href="">Text123</a></li>
        <li><a href="">Text321</a></li>
</ul>

Zbieramy wszystkie textNodes:

function getTextNodes(el){
    
    var textNodes = []
    
    function handler(node){
        if(node === null)
            return;

        if(node.nodeType === Node.TEXT_NODE)
            textNodes.push(node);

        if(node.nodeType !== Node.TEXT_NODE){
            node.childNodes.forEach((childNode) => {
                handler(childNode);
            });
        }
    }

    handler(el);

    return textNodes;
}

Budowa funkcji – tablica, hadler, handler, tablica.

W handlerze:

  • Warunek wyrwania się z funkcji
  • Warunek dopisania do tablicy
  • Pętla przechodząca po elementach następnych na każdym wywołująca rekurencyjnie handler

Dalej mamy wywołanie handlera i zwrot tablicy.