如何在jQuery中编写一个简单的预订DOM树遍历算法?

我想把这里找到的代码: 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来说太新了,不能再接受它了。

谢谢!

正如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被标记为弃用,因此命名(而不是匿名)函数

除非这是一个家庭作业,你不得不经历所有循环的疯狂,否则jQuery肯定会有更简单的方法来完成你想要做的任何事情……

jQuery有一组相当强大的选择器,它们允许您只选择并返回页面或元素中所有指定类型元素的集合(例如给定div标签中的所有段落标记)。 它们将按照它们在DOM中出现的顺序返回给您(这与上面提到的几乎相同)。 或者,您可以使用上面建议的filter。

如果你需要按照某种特定的顺序执行此操作,那么我建议使用选择器或filter来获取要启动的元素,然后递归循环遍历其子元素。 jQuery有一个内置函数来返回给定元素的子元素。

作为一个jQuery插件:(还添加了一个中断function(如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); } }); } 

我觉得它很简单

 var collection=$(document).contents().filter(function() { return this.nodeType == 3; }); 

然后,您可以使用$.eachcollection集上运行命令,或者如果要在集合上运行jQuery方法,则无法将其分配给变量并将方法链接到末尾。