2010-06-09 2 views
0

플래시 (실제로 Flex) 개체는 수정 된 버전의 embedCallAC_FL_RunContent.js 스크립트를 사용하여 업데이트 패널의 ASP.Net 페이지에 만들어 지므로 동적으로 작성할 수 있습니다. 이 스크립트는 해당 패널에 부분 포스트 백이있는 상태로 다시 작성됩니다. 페이지에는 다른 업데이트 패널도 있습니다.UpdatePanel에서 Flash Object에 대한 ExternalInterface 호출 대기 - 개선 필요

일부 포스트 백 (부분 및 전체)을 사용하면 $get('FlashObj').ExternalInterfaceFunc('arg1', 0, true);과 같은 외부 인터페이스 호출이 서버 측에서 준비되며 ScriptManager.RegisterStartupScript를 사용하여 페이지에 추가됩니다. 함수에 포함되어 Sys.Application의로드 이벤트에 채워집니다 (예 : Sys.Application.add_load(funcContainingExternalInterfaceCalls)).

문제는 각 부분 포스트 백과 함께 Flash 객체의 상태 상태가 변경 될 수 있기 때문에 JavaScript -> Flash External (외부) 인터페이스에서 Flash (Flex) 객체 및/또는 외부 인터페이스가 아직 준비되지 않았거나 DOM에 존재하지 않을 수 있습니다. 인터페이스 호출이 이루어진다. "개체가이 속성 또는 메서드을 지원하지 않습니다"라는 결과가 발생합니다.

Flash가 준비되어 있으면 즉시 ExternalInterface를 호출하거나 Flash에서 준비 상태가 될 때까지 기다리는 작업 전략이 있습니다.

//Called when the Flash object is initialized and can accept ExternalInterfaceCalls 
var flashReady = false; 
//Called by Flash when object is fully initialized 
function setFlashReady() { 
    flashReady = true; 
    //Make any queued ExternalInterface calls, then dequeue 
    while (extIntQueue.length > 0) 
     (extIntQueue.shift())(); 
} 
var extIntQueue = []; 
function callExternalInterface(flashObjName, funcName, args) { 
    //reference to the wrapped ExternalInterface Call 
    var wrapped = extWrap(flashObjName, funcName, args); 
    //only procede with ExternalInterface call if the global flashReady variable has been set 
    if (flashReady) { 
     wrapped(); 
    } 
    else { 
     //queue the function so when flashReady() is called next, the function is called and the aruments are passed. 
     extIntQueue.push(wrapped); 
    } 
} 
//bundle ExtInt call and hold variables in a closure 
function extWrap(flashObjName, funcName, args) { 
     //put vars in closure 
     return function() { 
      var funcCall = '$get("' + flashObjName + '").' + funcName; 
      eval(funcCall).apply(this, args); 
     } 
    } 

Flash (Flex) 객체가 포함 된 업데이트 패널을 업데이트 할 때마다 flashReady var을 dirty로 설정했습니다.

ScriptManager.RegisterClientScriptBlock(parentContainer, parentContainer.GetType(), "flashReady", "flashReady = false;", true); 

나는 내가이 일을 가지고 있음을 기쁘게 생각하지만, 해킹 같은 느낌. 나는 "eval()"이 명백하게 악의가되는 이유와 관련하여 학습 곡선에있다. 그래서 나는 최선의 방법을 위반하고 있는지 또는이 코드를 개선해야하는지 궁금하다. 감사.

답변

0

불행히도 저는 Flash가 호출을 수락 할 준비가되어 있는지 확인하고 명령을 대기 중인지 확인하는 것과 매우 유사한 해결 방법을 취해야했습니다.

여러 개의 ExternalInterface 호출을 빠르게 연속적으로 호출하면 (약 400 밀리 초보다 가깝게) 무시되거나 삭제 될 수있는 알려진 문제가 있습니다.

나는 당신의 고통을 느낍니다!

관련 문제