簡體   English   中英

如何在jQuery中編寫一個簡單的預訂DOM樹遍歷算法?

[英]How to write a simple preorder DOM tree traversal algorithm in jQuery?

我想在這里找到代碼: 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.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); }
    });
}

除非這是一個家庭作業,你不得不經歷所有循環的瘋狂,否則jQuery肯定會有一個更簡單的方法來完成你想要做的任何事情......

jQuery有一組非常強大的選擇器,它們允許您只選擇並返回頁面或元素中所有指定類型元素的集合(例如給定div標簽中的所有段落標記)。 它們將按照它們在DOM中出現的順序返回給您(這與上面提到的幾乎相同)。 或者,您可以使用上面建議的過濾器。

如果你需要以某種特定的順序執行此操作,那么我建議使用選擇器或過濾器來獲取要啟動的元素,然后遞歸循環遍歷其子元素。 jQuery有一個內置函數來返回給定元素的子元素。

我覺得它很簡單

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

然后,您可以使用$.eachcollection集上運行命令,或者如果要在集合上運行jQuery方法,則無法將其分配給變量並將方法鏈接到末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM