我想對DOM執行長時間運行,逐節點遍歷,在每個節點上調用一個函數,但不會使瀏覽器無響應。 所以我認爲異步是要走的路。使用jQuery異步DOM樹遍歷
我認爲jQuery的延期對象可以提供一個解決方案,但我還沒有設法拿出一個。
任何人都可以舉例說明如何使用jQuery(或另一個庫,如果特別突出顯示爲合適的;或者純Javascript和DOM方法)做到這一點。
爲了進一步複雜化,我希望能夠以不同的順序遍歷,例如postorder,但還不是一個需求。
我想對DOM執行長時間運行,逐節點遍歷,在每個節點上調用一個函數,但不會使瀏覽器無響應。 所以我認爲異步是要走的路。使用jQuery異步DOM樹遍歷
我認爲jQuery的延期對象可以提供一個解決方案,但我還沒有設法拿出一個。
任何人都可以舉例說明如何使用jQuery(或另一個庫,如果特別突出顯示爲合適的;或者純Javascript和DOM方法)做到這一點。
爲了進一步複雜化,我希望能夠以不同的順序遍歷,例如postorder,但還不是一個需求。
您可以通過設置超時遞歸執行此操作。由於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);
}
如果您可以使用HTML5,則某些瀏覽器支持Web工作人員。 https://developer.mozilla.org/En/Using_web_workers 這可能是一個選項。您可能能夠將DOM作爲文檔傳遞給方法並從那裏開始。
Web工作人員無法訪問DOM,因此他們不會幫助「長時間運行DOM節點的逐步散步」。 – jfriend00 2012-03-14 02:28:51
你可以看看https://github.com/wilsonpage/fastdom/這正是這麼做的,在DOM異步歡聲笑語。
您可能要檢查這種方法
https://gist.github.com/stelf/4b6935071447724c7066
根據克里斯·科瓦爾Q值庫。基本上與SynXsiS的想法類似,但是在Promises/Deffered對象方面更加結構化。
谷歌「多線程JavaScript」,你可以找到圖書館和答案(今天自己搜索同樣的東西...) – gdoron 2012-03-14 01:29:03
你有什麼想法?誠實地只是好奇。 – thescientist 2012-03-14 01:30:54