Итак, я пытаюсь создать функцию, которая будет console.log всего дерева DOM HTML-страницы. Предполагается выводить имя тега каждого HTML-элемента в том порядке, в котором они отображаются - потомки перед братьями и сестрами + имя атрибута.
У меня есть этот рабочий код:
"use strict";
document.addEventListener("DOMContentLoaded", traverse);
function traverse() {
let elm = document.documentElement;
displayInfo(elm);
};
function displayInfo(elm){
//console.log(elm)
/* if (elm.childElementCount>0) {
let children = Array.from(elm.children);
console.log(children);
children.forEach( displayInfo );
}; */
if (elm.hasAttributes) {
//console.log(elm.attributes[0]);
};
var c = elm.childNodes;
let i;
for (i = 0; i < c.length; i++) {
console.log(c[i].nodeName);
if (c[i].childElementCount>0) {
//console.log(c[i].childElementCount);
if (c[i].hasAttributes) {
//console.log(c[i].attributes[0]);
};
let cc = c[i].children;
let ii;
for (ii=0; ii < cc.length; ii++) {
console.log(cc[ii].nodeName);
if (cc[ii].hasAttributes) {
//console.log(cc[ii].attributes[0]);
};
if (cc[ii].childElementCount>0) {
//console.log(cc[ii].childElementCount);
let ccc = cc[ii].children;
let iii;
for (iii=0; iii < ccc.length; iii++) {
console.log(ccc[iii].nodeName);
if (ccc[iii].hasAttributes) {
//console.log(ccc[iii].attributes[0]);
};
if (ccc[iii].childElementCount>0) {
//console.log(ccc[iii].childElementCount);
let cccc = ccc[iii].children;
let iiii;
for (iiii=0; iiii < cccc.length; iiii++) {
console.log(cccc[iiii].nodeName);
if (cccc[iiii].hasAttributes) {
//console.log(cccc[iiii].attributes[0]);
};
if (cccc[iiii].childElementCount>0) {
console.log(cccc[iiii].childElementCount)
}
}
}
}
}
}
}
}
};
Проблема в том, что я ужасно повторяюсь, плюс я вручную устанавливаю, насколько «глубоко» он будет проходить. Есть ли способ объявить только одну функцию?
PS: я знаю, что смотреть на это ужасно, я просто следил за тем, чтобы функция работала все время.