我想在这里找到代码:http://www.jslab.dk/articles/non.recursive.preorder.traversal.part2
// HTML element
var root = document.documentElement;
recursivePreorder(root);
// Recusively find and handle all text nodes
function recursivePreorder(node) {
// If node is a text node
if (node.type == 3) {
// Do something with node
}
// else recurse for each child node
else {
for(var i=0; i<node.childNodes.length; i++)
recursivePreorder(node.childNodes[i]);
}
}
并将其转换为干净的jQuery。
有什么想法吗?我知道递归需要argument.callee,因为jQuery中的回调是匿名的,但我对JQuery来说太新了,不能再接受它了。
谢谢!
答案 0 :(得分:9)
正如Code Duck指出的那样,jQuery以源顺序遍历节点,深度优先 - 或者,就像你所说的那样,预先订购。但是,contents
只能获得直接的子节点,而不是后代。试试这个:
$(document).contents ().each (function processNodes ()
{
if (this.nodeType == 3)
doSomething (this); // do something with text node
else
$(this).contents ().each (processNodes);
});
顺便说一句,arguments.callee
被标记为弃用,因此命名(而不是匿名)函数
答案 1 :(得分:0)
除非这是一项家庭作业并且你不得不经历所有的疯狂行为,否则jQuery肯定会有更简单的方法来完成你想要做的任何事情......
jQuery有一组相当强大的选择器,它们允许您只选择并返回页面或元素中所有指定类型元素的集合(例如给定div标签中的所有段落标记)。它们将按照它们在DOM中出现的顺序返回给您(这与上面提到的几乎相同)。或者,您可以使用上面建议的过滤器。
如果你需要按照某种特定的顺序执行此操作,那么我建议使用选择器或过滤器来获取要启动的元素,然后递归遍历其子项。 jQuery有一个内置函数来返回给定元素的子元素。
答案 2 :(得分:0)
作为一个jQuery插件:(还添加了一个中断功能(如jQuery.each
),以及一个前或后订单的选项; YMMV与后期订单)
$.fn.walk = function(visit, post_order) {
if(this.length === 0) { return; }
this.each(function(i) {
if (!post_order) {
if (visit.call(this, i, this) === false) { return false; }
}
$j(this).children().walk(visit, post_order);
if (post_order) { return visit.call(this, i, this); }
});
}
答案 3 :(得分:-1)
我认为它就像
一样简单var collection=$(document).contents().filter(function() { return this.nodeType == 3; });
然后,您可以使用collection
在$.each
集上运行命令,或者如果要在集合上运行jQuery方法,则无法将其分配给变量和将方法链接到最后。