2012-03-14 120 views
1

我想對DOM執行長時間運行,逐節點遍歷,在每個節點上調用一個函數,但不會使瀏覽器無響應。 所以我認爲異步是要走的路。使用jQuery異步DOM樹遍歷

我認爲jQuery的延期對象可以提供一個解決方案,但我還沒有設法拿出一個。

任何人都可以舉例說明如何使用jQuery(或另一個庫,如果特別突出顯示爲合適的;或者純Javascript和DOM方法)做到這一點。

爲了進一步複雜化,我希望能夠以不同的順序遍歷,例如postorder,但還不是一個需求。

+0

谷歌「多線程JavaScript」,你可以找到圖書館和答案(今天自己搜索同樣的東西...) – gdoron 2012-03-14 01:29:03

+0

你有什麼想法?誠實地只是好奇。 – thescientist 2012-03-14 01:30:54

回答

1

您可以通過設置超時遞歸執行此操作。由於javascript是單線程的,因此您通過定期放棄線程來創建擁有多個線程的錯覺。調用setTimeout將排隊剩餘的工作並處理任何未完成的事件,然後繼續。

你的代碼可能是這個樣子......

function processNode(node) { 
    // Do whatever it is you want to do on the node 
    node.myMethod(); 
    var nextNode = null; 
    // Assume depth first 
    if (node.children().length) 
     nextNode = node.children().first(); 
    else if (node.next()) 
     nextNode = node.next(); 
    else 
    { 
     var parent = node.parent(); 
     while(parent && !parent.next()) 
      parent = parent.parent(); 
     if (!parent) 
      nextNode = parent.next(); 
    } 
    if (nextNode) 
     setTimeout(function(){processNode(nextNode);}, 200); 
} 
+0

while(parent &&!parent.next())'沒有問題,因爲parent是一個jQuery對象,所以它總是非空的。另外,是不是需要停止向父節點上方傳遞的節點? – jfriend00 2012-03-14 03:13:14

+0

@ jfriend00你是對的。你會想檢查父母的長度。同樣正確的是檢查父節點是否是起始節點。代碼意味着更多的僞代碼才能啓動OP。 – SynXsiS 2012-03-14 03:26:43

0

如果您可以使用HTML5,則某些瀏覽器支持Web工作人員。 https://developer.mozilla.org/En/Using_web_workers 這可能是一個選項。您可能能夠將DOM作爲文檔傳遞給方法並從那裏開始。

+0

Web工作人員無法訪問DOM,因此他們不會幫助「長時間運行DOM節點的逐步散步」。 – jfriend00 2012-03-14 02:28:51