Processing.js不允许在firefox中使用外部javascript绑定

时间:2012-01-25 12:30:48

标签: javascript firefox canvas processing.js

我正在尝试将数据发送到处理脚本。但由于某种原因,下面的变量pjs绑定到画布"能力1"并输入第一个if语句,但随后bindJavascript(this)-call返回错误,但仅在firefox中。 (在chrome中完美运行):

[pjs.bindJavascript不是函数]

var bound = false;
function initProcessing(){

    var pjs = Processing.getInstanceById('competence1');

        if (pjs != null) {

        // Calling the processing code method
        pjs.bindJavascript(this);
        bound = true;

        //Do some work
    }
    if(!bound) setTimeout(initProcessing, 250);
}

环境:Mac OS X - Lion; OBS! bindJavascript(this) - 方法存在于canvas-tag

中加载的pde脚本中

2 个答案:

答案 0 :(得分:0)

通过将我的所有脚本包装在varable-map中并使用第二种方式调用setTimeout,我可以跟踪每个状态并控制结果。

所以把它包起来 - >

var ex = {
    init : function(canId){
        var canId = canId;
        // check the if bound 
        // bind in this closure
        // set new timer
    }
} 

的setTimeout - >

setTimeout('ex.init("'+canId+'")', 2000); 

和ofcourse添加参数,以便它可以在自己执行期间保存该值。所以处理工作得很好,我应该更频繁地使用闭包,这就是解决方案。

答案 1 :(得分:0)

我遇到了同样的问题。我使用了几乎相同的JS(我从Pomax教程中获得),它工作得很好。但是,当我添加以下预加载指令(加载背景)时,突然我的initProcessing函数停止工作。

/* @pjs preload="metal_background.jpg"; */

错误消息相同: pjs.bindJavascript不是函数

在调试时,我可以看到pjs对象确实没有公开bindJavaScript函数,即使在我的PDE文件中声明了一个。

事实证明这完全取决于时间......预加载减慢了处理对象的初始化,所以第二次循环250ms循环,pjs对象存在,但还没有它的bindJavaScript函数。

我不是100%确定Processing.js如何构建这个对象,但在这种情况下,一个简单的解决方案就是检查bindJavaScript是否实际定义了!我将代码更改为以下内容:

        var bound = false;
        function initProcessing() {
            var pjs = Processing.getInstanceById('mySketchId');

            if(pjs != null) {

                if(typeof(pjs.bindJavaScript) == "function") {
                    pjs.bindJavaScript(this);
                    bound = true;
                }
            }

            if(!bound) setTimeout(initProcessing, 250);
        }

在此之后它运作良好!