Poznajemy kolejny wzorzec rekurencyjny – warunek bazowy i return. Do dzieła.
Oto nasz mocno zagnieżdżony element:
<ul id="myUl"><li><a href="">Text123</a></li></ul>
Chcemy się tam dobrać do jego textNode. Zobaczmy w uproszczeniu, jak by to wyglądało:
window.addEventListener('DOMContentLoaded', function(){
let ul = document.getElementById("myUl");
console.log(ul);
//ul
console.log(ul.nodeType === Node.TEXT_NODE);
//flase
ul = ul.childNodes[0];
console.log(ul);
//li
console.log(ul.nodeType === Node.TEXT_NODE);
//false
ul = ul.childNodes[0];
console.log(ul);
//a
console.log(ul.nodeType === Node.TEXT_NODE);
//flase
ul = ul.childNodes[0];
console.log(ul);
//text
console.log(ul.nodeType === Node.TEXT_NODE);
//true
});
Ok, piszemy funkcję:
function getTextNode(el){
if(el.nodeType === Node.TEXT_NODE)
return el;
return getTextNode(el.childNodes[0]);
}
window.addEventListener('DOMContentLoaded', function(){
let ul = document.getElementById("myUl");
let txtNode = getTextNode(ul);
console.log("text", txtNode);
//#text "Text123"
});
Jest warunek bazowy, warunek zwrotu wartości oraz rekurencyjne wywołanie funkcji (koniecznie z return) na następnym elemencie.
Warunków bazowych może być więcej i mogą one obsługiwać różne błędy, ale musi być ten jeden, który obsługuje zwrot ostatniego elementu:
function getTextNode(el){
if(el === null)
return null;
if(el.nodeType === Node.TEXT_NODE)
return el;
return getTextNode(el.childNodes[0]);
}
window.addEventListener('DOMContentLoaded', function(){
let ul = document.getElementById("myUlNonExisting");
let txtNode = getTextNode(ul);
console.log("text", txtNode);
//text null
});
Więcej wzorów rekurencyjnych w następnych lekcjach.