AS3.0中addCallback用法
瀏覽量:7964
在AS3編程中,如果我們要JavaScript來調用AS3中的函數,常用的方法就是使用ExternalInterface類中的addCallback方法。該方法官方解釋如下:將 ActionScript 方法注冊為可從容器調用。 成功調用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代碼可以調用在 Flash Player 中注冊的函數。
在AS3中,該方法的原始定義如下
public static function addCallback(functionName:String, closure:Function):void
他有2個參數,第二個參數指的是AS3中需要調用的函數名,第一個參數則是JS中調用的函數名,我們看AS3中關于這個函數的使用幫助中有如下說明:
在包含 SWF 文件的 HTML 頁中,在該文件的 object 標簽中設置以下參數:
<param name="allowScriptAccess" value="always" />
在 SWF 文件中,添加以下 ActionScript:
flash.system.Security.allowDomain(sourceDomain )
這2個說明其實是為了解決安全沙箱的問題,但是實際使用中,我們常常還會遇到更加頭疼的問題。
比如AS3中有個函數叫
showMC(mc:MovieClip):void;
我們使用
ExternalInterface.addCallback("showMC" , jsshowMC) ;
來注冊一個外部接口函數,ok,我們同樣設置allowScriptAccess為always和allowDomain(*),但是JS經常還是會報錯:jsshowMC is not a Function,這是為什么呢?進過多次試驗,原來才發現,AS3中,如果需要使用addCallback函數來注冊外部函數接口,那么必須是當前的swf完全加載完畢才能注冊成功,如果還在當前swf加載的過程中就在JS中調用的話肯定會因為找不到函數而報錯。
解決辦法有幾個,一個是swf盡可能的小,提高加載速度,當然這個指標不治本,那么,我們可以在JS中來判斷所調用的函數是否有效,如果所調用的函數未定義,那么我們就等待,比如我們可以用一個Timer:setTimeout("checkFuncName()",100);每隔100毫秒來調用checkFuncName檢測函數是否有效,checkFuncName里我們可以寫檢測函數是否是undefined,如果是就繼續循環。