2012-01-25 2 views
1

처리 스크립트로 데이터를 보내려고합니다. 그러나 아래의 변수 pjs는 캔버스 "competence1"에 바인드되어 첫 번째 if 문을 입력하지만 bindJavascript (this) -call은 오류를 반환하지만 파이어 폭스에서만 반환됩니다. (크롬에서 완벽하게 작동) :Processing.js가 파이어 폭스에서 외부 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); 
} 

환경 : 맥 OS X - 사자; OBS! bindJavascript (this) - 메서드가 캔버스 태그에로드 된 pde 스크립트에 있습니다.

+0

JS가 한 스레드에서 작동하므로 JS가 파이어 폭스에서 바인드한다고 가정 할 때 시간에 따라 다른 값을 가지므로 내 문제의 해결책을 발견했습니다. setTimeout 함수는 firefox가 위의 설정으로 안정적으로 크롬을 사용한다고 가정 할 때마다 firefox가 올바르게 바인딩 될 때까지 약 2000ms가 필요하기 때문에 파이어 폭스의 작동이 훨씬 효율적이지 않다고 결론 지을 수 있습니다. –

답변

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

및 당연히 그래서 그 자체가 실행 중에 그 값을 저장할 수있는 매개 변수를 추가

. 그래서 처리가 잘 작동하고 나는 closure를 더 자주 사용해야한다. 이것이 해결책이다.

0

동일한 문제가있었습니다. 나는 거의 동일한 JS를 사용했다. (Pomax 튜토리얼에서 얻은 것이다.) 잘 동작하고 있었다. 그러나 다음과 같은 preload 지시문을 추가하면 (배경을로드하기 위해) 갑자기 내 initProcessing 함수가 작동을 멈췄습니다. pjs.bindJavascript이 경우에도 디버깅에

, 내가 PJS 객체가 실제로 bindJavaScript 기능을 노출하지 않은 것을 볼 수있는 기능되지 않습니다 :

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

오류 메시지는 동일했다 하나는 내 PDE 파일에 선언되었습니다.

이것은 완전히 타이밍에 달했던 것으로 밝혀졌습니다 ... 예고는 처리 객체의 초기화를 늦추므로 두 번째로 250ms 루프를 돌면서 pjs 객체가 존재하지만 아직 bindJavaScript가 없습니다. 기능.

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

이 코드가 제대로 작동했습니다.