我有以下内容:
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) {
但我不清楚如果我进行转换,我将如何称呼当前的孩子?我将不再需要 i 来澄清孩子的索引位置。有什么建议吗?
谢谢!
更新:
根据回答建议,我现在正在使用以下内容。这是这样做的正确/最有效的方法吗?
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]);
};
function allDescendants (node) {
for (var i = 0; i < node.childNodes.length; i++) {
var child = node.childNodes[i];
allDescendants(child);
doSomethingToNode(child);
}
}
你遍历所有的孩子,对于每个元素,你调用相同的函数并让它遍历该元素的孩子。
通常你会有一个可以在所有节点上递归调用的函数。这真的取决于你想对孩子做什么。如果你只是想收集所有的后代,那么
element.getElementsByTagName
可能是更好的选择。
var all = node.getElementsByTagName('*');
for (var i = -1, l = all.length; ++i < l;) {
removeTest(all[i]);
}
不需要对所有孩子调用“allDescendants”方法,因为该方法本身已经这样做了。所以删除最后一个代码块,我认为这是一个合适的解决方案(á,不是 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);
您可以使用 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;
};
这个函数返回元素的所有孩子的孩子。
在现代浏览器或 babel 中最明确的方法是这样的。假设你有一个 HTML 节点
$node
你想递归它的孩子。
Array.prototype.forEach.call($node.querySelectorAll("*"), function(node) {
doSomethingWith(node);
});
任何DOM节点上的
querySelectorAll('*')
都会给你allNodeList
中元素的子节点。 NodeList
是一个类似数组的对象,因此您可以使用 Array.prototype.forEach.call
遍历此列表,在回调中逐一处理每个子项。
如果你有 jquery 并且你想获得所有你可以使用的后代元素:
var all_children= $(parent_element).find('*');
请注意,
all_children
是一个 HTML 集合,而不是数组。当您只是循环时,它们的行为相似,但集合没有很多您可能会喜欢的有用的 Array.prototype
方法。
如果项目是在循环中创建的,你应该通过 id="" data-name 或其他东西留下索引。然后你可以直接索引它们,这对于大多数函数来说会更快,比如 (!-F)。对于 1024 位 x 100 项,效果很好,具体取决于您在做什么。
if ( document.getElementById( cid ) ) {
return;
} else {
what you actually want
}
在大多数情况下,一旦项目已经加载,这会更快。仅在重新加载或安全域传输/登录/cors 时擦除页面,并且您做某事两次。
要将 all 后代作为数组,使用:
function getAllDescendants(node) {
var all = [];
getDescendants(node);
function getDescendants(node) {
for (var i = 0; i < node.childNodes.length; i++) {
var child = node.childNodes[i];
getDescendants(child);
all.push(child);
}
}
return all;
}
如果你使用 js 库,就这么简单:
$('.lbExclude').remove();
否则如果你想获取一个节点下的所有元素你可以原生收集它们:
var nodes = node.getElementsByTagName('*');
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
if (hasClass(n, 'lbExclude')) {
node.parentNode.removeChild(node);
}
}
TreeNode node = tv.SelectedNode;
while (node.Parent != null)
{
node = node.Parent;
}
CallRecursive(node);
private void CallRecursive(TreeNode treeNode)
{
foreach (TreeNode tn in treeNode.Nodes)
{
//Write whatever code here this function recursively loops through all nodes
CallRecursive(tn);
}
}
基本思想是记住DOM是一个
tree
结构。所以,使用递归的方法,思路是:
childNodes
函数迭代孩子;例如:
function doSomething(obj) {
// Processing parent obj here
if(obj.childNodes !== undefined && obj.childNodes !== null) {
obj.childNodes.forEach((c) => {
doSomething(c)
})
}
}
请注意,迭代中
doSomething
上的“obj”参数实际上是“子”对象。因此,您正在处理每次交互的子节点,这意味着在循环和所有递归调用结束时,此代码将处理树中从“obj”开始的所有节点。
希望对您有所帮助!