我在处理中编写了自己的草图,并使用processingjs和ajax将其插入到页面上,如下所示:
$.getScript("js/libs/processingjs.js", function() {
$('#sketch').each(function() {
Processing.loadSketchFromSources(this, [$(this).data('processing-sources')]);
});
});
这里是画布#sketch
指的是:
<canvas data-processing-sources="first-sketch.pde" id='sketch'></canvas>
这很有效,但我也希望使用Javascript与草图进行交互。当我在我的(firebug)控制台中键入它时,一切都很好:
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 :(得分: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);
答案 1 :(得分: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
。