2012-01-25 32 views
1

我試圖將數據發送到處理腳本。但由於某種原因,下面的變量pjs綁定到畫布「competence1」並輸入第一個if語句,但是bindJavascript(this)-call返回錯誤,但僅在Firefox中。 (完全在鉻):Processing.js不允許在Firefox中使用外部JavaScript綁定

[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的 - 獅子; OBS! bindJavascript(this) - 方法存在於加載在畫布標籤中的pde腳本中

+0

我已經找到了我的問題的解決方案,因爲JS使用一個線程上面的代碼具有其他值的時間pjs是假設在Firefox中綁定的時間。由於setTimeout函數需要大約2000毫秒的時間才能正確綁定firefox,因爲我們只能得出結論,firefox在操作上效率低很多。 –

回答

0

通過將我所有的腳本包裝在可調映射中,並使用第二種方法調用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加入,因此可以將其自身的執行過程中認爲值的參數。所以處理工作很好,我應該更頻繁地使用閉包,這就是解決方案。

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); 
     } 

之後它工作正常!