2012-03-14 116 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