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に変換します。

何か案が?jQueryのコールバックは匿名であるため、再帰にはargument.calleeが必要ですが、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 に答える