Processing.js не разрешает внешнее связывание JavaScript в Firefox - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь отправить данные в сценарий обработки. Но по какой-то причине приведенная ниже переменная pjs привязывается к холсту «компетенция1» и вводит первый оператор if, но затем bindJavascript (this) -call возвращает ошибку, но только в firefox. (отлично работает в хроме):

[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) - метод существует в скрипте pde, загруженном в тэг canvas

Ответы [ 2 ]

0 голосов
/ 27 июля 2014

У меня была такая же проблема.Я использовал почти такой же JS для вас (который я получил из учебника Pomax), и он работал нормально.Однако, когда я добавил следующую директиву предварительной загрузки (для загрузки фона), внезапно моя функция initProcessing перестала работать.

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

Сообщение об ошибке было таким же: pjs.bindJavascript не является функцией

При отладке я мог видеть, что у объекта pjs действительно не была выставлена ​​функция bindJavaScript, даже если она была объявлена ​​в моем файле PDE.

Оказывается, это былочисто из-за времени ... предварительная загрузка замедлила инициализацию объекта обработки, поэтому во второй раз за цикл 250 мс объект pjs существовал, но еще не имел своей функции bindJavaScript.

IЯ не уверен на 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);
        }

После этого все заработало!

0 голосов
/ 01 февраля 2012

Свернув весь мой скрипт в 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); 

и конечно добавляют параметр, чтобы он мог хранить это значение во время собственного выполнения. Таким образом, обработка работает очень хорошо, и я должен использовать замыкание чаще, вот решение.

...