Я не знаю точную природу вашей ошибки, потому что я не хочу пытаться проанализировать, как поведет себя jQuery.
Вместо этого проще просто переписать. Это простая рекурсивная функция, которая использует собственный API, чтобы делать то, что вы хотите.
function indent(n) { return "\t".repeat(n) }
function print(depth, s) { console.log(indent(depth) + s) }
function walk(root, depth) {
print(depth, "(")
for (const ch of root.children) {
if (ch.matches(".value")) {
print(depth + 1, ch.firstElementChild.value)
} else if (ch.matches(".nest")) {
walk(ch, depth + 1)
}
}
print(depth, ")")
}
// Run after the DOM is loaded
document.addEventListener("DOMContentLoaded", function() {
walk(document.body.querySelector(".nest"), 0)
})
<div class="nest">
<div class="value">
<input type="text" class="hasvalue" value="level1" />
</div>
<div class="value">
<input type="text" class="hasvalue" value="level1" />
</div>
<div class="value">
<input type="text" class="hasvalue" value="level1" />
</div>
<div class="nest">
<div class="value">
<input type="text" class="hasvalue" value="level2" />
</div>
<div class="value">
<input type="text" class="hasvalue" value="level2" />
</div>
<div class="nest">
<div class="value">
<input type="text" class="hasvalue" value="level3" />
</div>
</div>
<div class="value">
<input type="text" class="hasvalue" value="level2" />
</div>
</div>
<div class="value">
<input type="text" class="hasvalue" value="level1" />
</div>
<div class="value">
<input type="text" class="hasvalue" value="level1" />
</div>
</div>
Я изменил ваши атрибуты id
на class
, поскольку идентификаторы в документе должны быть уникальными. Учитывая мою переписанную выше, мы могли бы получить с идентификаторами, но это все еще не здорово.