[英]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; });
然后,您可以使用$.each
在collection
集上運行命令,或者如果要在集合上運行jQuery方法,則無法將其分配給變量並將方法鏈接到末尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.