2012-03-14 10 views
1

DOMの長時間実行によるノード・バイ・ウォークを実行し、各ノードで関数を呼び出しますが、ブラウザを応答しないようにしたいとします。 だから私は非同期が行く方法だと思っています。jQueryを使用した非同期DOMツリーのトラバーサル

私はjQuery Deferredオブジェクトが解決策を提供できると思いますが、私はまだそれを考え出すことはできませんでした。

jQuery(または別のライブラリ、特に適切と思われる場合は別のライブラリ、または純粋なJavascriptメソッドとDOMメソッド)を使用してどのようにできるかの例を挙げることができます。

さらに複雑にするために、私は異なる順序、例えば序列を横断する能力を望んでいますが、まだ要件はありません。

+0

google "multithread javascript"ライブラリとそこにある回答を見つけることができます(同じことを自分自身で検索しました...) – gdoron

+0

あなたは何を思いついていますか?正直に好奇心が強い。 – thescientist

答えて

1

これは、set timeoutを使用して再帰的に行うことができます。 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

親がjQueryオブジェクトなので 'while(parent &&!parent.next())'に問題はありませんので、常にnullではありません。また、渡されたノードの上の親に行くのを止める必要はありませんか? – jfriend00

+0

@ jfriend00あなたは正しいです。代わりに親の長さをチェックしたいと思うでしょう。また、親が開始ノードであるかどうかのチェックについても正しい。このコードは、OPを開始するための擬似コードとしてより多くの意味があります。 – SynXsiS

0

HTML5を使用できる場合、一部のブラウザではウェブワーカーがサポートされています。 https://developer.mozilla.org/En/Using_web_workers これはオプションです。 DOMをドキュメントとしてメソッドに渡してそこから移動することができます。

+0

WebワーカーはDOMにアクセスすることができないため、「DOMの長時間ノード・ウォーク」に役立たないでしょう。 – jfriend00

0

あなたはクリスコワルのQライブラリに基づいて、このアプローチに

https://gist.github.com/stelf/4b6935071447724c7066

をチェックすることもできます。基本的にSynXsiSのアイデアと似ていますが、Promises/Defferedオブジェクトという点ではもう少し構造化されています。

関連する問題