Как сделать этот цикл всеми детьми рекурсивно?
У меня есть следующее:
for (var i = 0; i < children.length; i++){
if(hasClass(children[i], "lbExclude")){
children[i].parentNode.removeChild(children[i]);
}
};
Мне бы хотелось, чтобы он проходил через всех дочерних детей и т.д. (а не только на верхнем уровне). Я нашел эту строку, которая, похоже, делает это:
for(var m = n.firstChild; m != null; m = m.nextSibling) {
Но я не понимаю, как я отношусь к текущему ребенку, если я сделаю этот переключатель? Мне больше не нужно было разъяснять положение индекса ребенка. Любые предложения?
Спасибо!
Update:
Теперь я использую следующее, в соответствии с предложениями ответа. Это правильный/наиболее эффективный способ сделать это?
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]);
};
Ответы
Ответ 1
Обычно у вас должна быть функция, которая может быть рекурсивно названа на всех узлах. Это действительно зависит от того, что вы хотите делать с детьми. Если вы просто хотите собрать всех потомков, то element.getElementsByTagName
может быть лучшим вариантом.
var all = node.getElementsByTagName('*');
for (var i = -1, l = all.length; ++i < l;) {
removeTest(all[i]);
}
Ответ 2
function allDescendants (node) {
for (var i = 0; i < node.childNodes.length; i++) {
var child = node.childNodes[i];
allDescendants(child);
doSomethingToNode(child);
}
}
Вы перебираете все дочерние элементы, и для каждого элемента вы вызываете одну и ту же функцию и пропустите ее над дочерними элементами этого элемента.
Ответ 3
Нет необходимости вызывать метод allDescendants для всех детей, потому что сам метод уже делает это. Поэтому удалите последний блок кода, и я думаю, что это правильное решение (á, not thé =])
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);
Ответ 4
Если у вас есть jquery, и вы хотите получить все элементы-потомки, вы можете использовать:
var all_children= $(parent_element).find('*');
Просто помните, что all_children
- это коллекция HTML, а не массив. Они ведут себя аналогичным образом, когда вы просто зацикливаете, но в коллекции нет много полезных методов Array.prototype
, которые вы могли бы использовать.
Ответ 5
Если вы используете библиотеку js, это так просто:
$('.lbExclude').remove();
В противном случае, если вы хотите приобрести все элементы под node, вы можете собрать их изначально:
var nodes = node.getElementsByTagName('*');
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
if (hasClass(n, 'lbExclude')) {
node.parentNode.removeChild(node);
}
}
Ответ 6
Вы можете использовать BFS для поиска всех элементов.
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;
};
Эта функция возвращает все дочерние элементы дочернего элемента.