我想对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