【发布时间】:2018-05-12 10:30:29
【问题描述】:
所以我正在尝试创建一个函数,它将 console.log 整个 HTML 页面的 DOM 树。它应该按照它们出现的顺序输出每个 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:我知道这看起来很糟糕,我只是确保该功能能够一直“工作”。
【问题讨论】:
-
而不是
if (condition) { big block },你可以if (!condition) continue;来减少缩进地狱。 -
在示例中会是什么样子?很抱歉,我仍然不完全熟悉 if 语句
标签: javascript function for-loop