2012-04-23 5 views
3

私は、処理中に自分のスケッチを書かれており、そのようなprocessingjsとAjaxを使ってページに挿入されている。しかし、processingjsスケッチがいつロードされたかを知るには?

<canvas data-processing-sources="first-sketch.pde" id='sketch'></canvas> 

これは動作します:ここに

$.getScript("js/libs/processingjs.js", function() { 
    $('#sketch').each(function() { 
     Processing.loadSketchFromSources(this, [$(this).data('processing-sources')]); 

    }); 
}); 

はキャンバス#sketchが参照しているあります私はまた、Javascriptを使ってスケッチとやりとりしたい。私は私の(放火魔)でこれを入力すると、すべてが素晴らしい作品コンソール:

var sketch = Processing.getInstanceById('sketch'); 
sketch.addTweet(30, 30, 100); 

(addTweetはスケッチがロードされた後に利用可能となるスケッチ、の関数である) しかし、私はのようなjavascriptの内側に置くときそう:

$.getScript("js/libs/processingjs.js", function() { 
    $('#sketch').each(function() { 
     Processing.loadSketchFromSources(this, [$(this).data('processing-sources')]); 


     var sketch = Processing.getInstanceById('sketch'); 
     sketch.addTweet(30, 30, 100); 

    }); 
}); 

私はエラーを取得する:

Uncaught TypeError: Cannot call method 'addTweet' of undefined 

私はスケッチは、この時点でロードされていない、コールバックまたはコードを実行するための適切な方法があると思いますそれがロードされたら?

scriptタグにprocessingjs libを含めると、同じエラーが表示されます。 jQuery.readyでコードを実行します。

+0

これはまだ解決されていないようです。 [ここにいくつかの洞察があります](https://processing-js.lighthouseapp.com/projects/41284/tickets/1887)。 –

+0

インスタンスが 'undefined'を返さなくなるまで単に' setInterval'をポーリングすることをお勧めします –

答えて

1

私のプロジェクトのためにまとめたものです。それはかなりではありませんが、仕事は終わりです(今のところ)。

var timer = 0, 
    timeout = 3000, 
    mem = setInterval(function() { 
     var sketch = Processing.getInstanceById("processingCanvas"); 
     if (sketch) { 
      console.log("SKETCH HAS LOADED"); 
      clearInterval(mem); 
     } else { 
      timer += 10; 
      if (timer > timeout) { 
       console.log("FAILED TO LOAD SKETCH"); 
       clearInterval(mem); 
      } 
     } 
    }, 10); 
0

問題は、loadSketchFromSourcesが同期していないことです。

loadSketchFromSources関数に(github、latest)コールバックが追加されました。したがって、コードを次のように書くことができます:

$.getScript("js/libs/processingjs.js", function() { 
    $('#sketch').each(function() { 
     Processing.loadSketchFromSources(this, [$(this).data('processing-sources')], function(sketch) { 
      sketch.addTweet(30, 30, 100); 
     }); 
    }); 
}); 

idの代わりにクラスを使用することもできます。コールバックでスケッチを取得し、getInstanceByIdを使用する必要はありません。

+0

これは最終的に追加されたことを確認するために恐ろしいです:) – askmike

関連する問題