2

我想使用这里找到的代码: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 太陌生,无法进一步了解它。

谢谢!

4

4 回答 4

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

于 2010-01-18T08:01:37.930 回答
0

除非这是一个家庭作业并且你被迫经历所有疯狂的循环,否则使用 jQuery 肯定有一种更简单的方法来完成你想要做的任何事情......

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

如果您需要按特定顺序执行此操作,那么我建议使用选择器或过滤器来获取您想要开始的元素,然后递归地遍历其子元素。jQuery 有一个内置函数来返回给定元素的子元素。

于 2010-01-18T07:41:08.220 回答
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); }
    });
}
于 2013-02-22T01:32:41.870 回答
-1

我认为这很简单

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

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

于 2010-01-17T20:50:16.237 回答