2012-01-25 3 views
1

処理スクリプトにデータを送信しようとしています。しかし何らかの理由で、以下の変数pjsがキャンバス "competence1"にバインドして最初のif文を入力しますが、次にbindJavascript(this)呼び出しはエラーを返しますが、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!バインドされたjavascript(this) - メソッドは、キャンバスタグにロードされたpdeスクリプトに存在します。

+0

私はJSが1つのスレッドで動作するので、私の問題の解決策を見つけました。上記のコードは、pjsがfirefoxでバインドすると思われる時間までに他の値を持っています。上記の設定で確実にこれを行う人にクロームを設定すると、毎回firefoxが正しくバインドするためには、setTimeout関数が約2000ミリ秒必要なので、私はfirefoxの動作がそれほど効率が悪いと結論づけることができます。 –

答えて

0

varable-mapにすべてのスクリプトをラップし、setTimeoutの2番目の方法を使用して、結果を制御する。

ので、それを包む - >

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ファイルで宣言されています。

これは完全にタイミングがずれていることが判明しました...プリロードが処理オブジェクトの初期化を遅くしていたので、2回目の250msループの間、pjsオブジェクトは存在しましたが、まだbindJavaScript関数。

Processing.jsがこのオブジェクト構造をどのようにしているのかは100%はわかりませんが、この場合、単純に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); 
     } 

この後、正常に機能しました!