2010-06-09 37 views
0

使用embedCallAC_FL_RunContent.js腳本的修改版本,可以在更新面板的ASP.Net頁面上創建Flash(實際上是Flex)對象,以便它可以動態寫入。它用這個腳本重新創建,每個部分回發到該面板。頁面上還有其他更新面板。隊列ExternalInterface調用UpdatePanel中的Flash對象 - 需要改進?

對於一些回發(部分和全部),外部接口調用(如$get('FlashObj').ExternalInterfaceFunc('arg1', 0, true);)已準備好服務器端,並使用ScriptManager.RegisterStartupScript添加到頁面中。它們被嵌入到函數中並塞入到Sys.Application的加載事件中,例如Sys.Application.add_load(funcContainingExternalInterfaceCalls)

問題是因爲Flash對象的狀態狀態可能隨着每個部分回發而改變,所以當JavaScript - > Flash External(Flash)對象和/或外部接口可能沒有準備好,或者甚至還沒有存在於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毫秒)可能會導致一些被忽略或丟失。

我感到你的痛苦!

相關問題