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