как сделать этот цикл рекурсивным для всех детей?

<p>у меня есть следующее:</p><pre><code>for (var i = 0; i < children.length; i++){ if(hasclass(children[i], "lbexclude")){ children[i].parentnode.removechild(children[i]); } }; </code></pre><p>я хотел бы, чтобы он прошел через всех детей детей и т.д. (не только на верхнем уровне). я нашел эту строку, которая, кажется, делает это:</p><pre><code>for(var m = n.firstchild; m != null; m = m.nextsibling) { </code></pre><p>но мне неясно, как я отношусь к текущему ребенку, если я сделаю это переключение? у меня больше не было бы возможности уточнить индекс позиции ребенка. какие-либо предложения?</p><p>спасибо!</p><p>обновление:</p><p>я сейчас использую следующее, в соответствии с предложениями ответа. это правильный/самый эффективный способ сделать это?</p><pre class="lang-js prettyprint-override"><code>function removetest(child) { if (hasclass(child, "lbexclude")) { child.parentnode.removechild(child); } } function alldescendants(node) { for (var i = 0; i < node.childnodes.length; i++) { var child = node.childnodes[i]; alldescendants(child); removetest(child); } } var children = temp.childnodes; for (var i = 0; i < children.length; i++) { alldescendants(children[i]); }; </code></pre>

<p>обычно у вас есть функция, которую можно вызывать рекурсивно на всех узлах. это действительно зависит от того, что вы хотите сделать с детьми. если вы просто хотите собрать всех потомков, то <code>element.getelementsbytagname</code> может быть лучшим вариантом.</p><pre><code>var all = node.getelementsbytagname('*'); for (var i = -1, l = all.length; ++i < l;) { removetest(all[i]); } </code></pre>

<pre><code>function alldescendants (node) { for (var i = 0; i < node.childnodes.length; i++) { var child = node.childnodes[i]; alldescendants(child); dosomethingtonode(child); } } </code></pre><p>вы перебираете все дочерние элементы, и для каждого элемента вы вызываете одну и ту же функцию, и она зацикливается на дочерних элементах этого элемента.</p>

<p>нет необходимости вызывать метод 'alldescendants' для всех дочерних элементов, потому что сам метод уже делает это. поэтому удалите последний кодовый блок, и я думаю, что это правильное решение (а не =)</p><pre><code> function removetest(child){ if(hasclass(child, "lbexclude")){ child.parentnode.removechild(child); } } function alldescendants (node) { for (var i = 0; i < node.childnodes.length; i++) { var child = node.childnodes[i]; alldescendants(child); removetest(child); } } var children = alldescendants(temp); </code></pre>

<p>если элементы создаются в цикле, вы должны оставить индекс через id = "" data-name или что-то еще. затем вы можете индексировать их напрямую, что будет быстрее для большинства функций, таких как (! -f). хорошо работает для 1024 бит х 100 элементов в зависимости от того, что вы делаете.</p><pre><code>if ( document.getelementbyid( cid ) ) { return; } else { what you actually want } </code></pre><p>это будет быстрее в большинстве случаев, когда элементы уже загружены. только почистите страницу при перезагрузке или безопасных передачах доменов/логинах/cors, и вы делаете что-то дважды.</p>

<p>вы можете использовать bfs, чтобы найти все элементы.</p><pre><code>function(element) { // [].slice.call() - htmlcollection to array var children = [].slice.call(element.children), found = 0; while (children.length > found) { children = children.concat([].slice.call(children[found].children)); found++; } return children; }; </code></pre><p>эта функция возвращает всех дочерних дочерних элементов элемента.</p>

<p>если у вас есть jquery и вы хотите получить все элементы-потомки, вы можете использовать:</p><pre><code> var all\_children= $(parent_element).find(''); просто помните, что all_children - это коллекция html, а не массив. они ведут себя аналогично, когда вы просто зацикливаетесь, но коллекция не имеет много полезных методов array.prototype, которые вы могли бы в противном случае использовать. 

самый ясный способ сделать это в современных браузерах или с babel - это. скажем, у вас есть html-узел $node</code>, чьи дети вы хотите сохранить.</p><pre><code>array.prototype.foreach.call($node.queryselectorall(""), function(node) { dosomethingwith(node); }); функция queryselectorall('') на любом узле dom выдаст вам все дочерние узлы элемента в переменной nodelist. nodelist является объектом, похожим на массив, поэтому вы можете использовать array.prototype.foreach.call для итерации по этому списку, обрабатывая каждого потомка один за другим в обратном вызове.

если вы используете библиотеку js, это так просто:$('.lbexclude').remove(); </code></pre><p>в противном случае, если вы хотите получить все элементы в узле, вы можете собрать их все изначально:</p><pre><code>var nodes = node.getelementsbytagname('*'); for (var i = 0; i < nodes.length; i++) { var n = nodes[i]; if (hasclass(n, 'lbexclude')) { node.parentnode.removechild(node); } } </code></pre>