1. 程式人生 > >JS/AS(Flash)通訊失效的可能原因

JS/AS(Flash)通訊失效的可能原因

tag:

js as 通訊 呼叫 flash actionscript ExternalInterface addCallback call 失效

我在AS2開發中遇到了這樣的問題:

通過ExternalInterface.addCallback給flash物件新增的方法,在IE6,FF3.5等環境均能正常呼叫,但是一到IE7/IE8中就出現問題。

但是之前開發的作品中,有些又沒有這樣的問題。

經過檢查,發現是因為沒有在意,將addCallback()方法的呼叫寫在了全域性過程之中。

這樣可能會導致一個問題:在Flash載入未完全就緒的情況下,呼叫addCallback()可能無法起到其應有的作用。

解決辦法如下:

推薦方法:在AS2中,將addCallback()的呼叫程式碼轉移到_root.onLoad事件處理函式之中,可以保證程式碼執行時,Flash已經載入就緒。

或者,據說,將addCallback()丟到setTimeout中以延時執行,也能夠達到目的。(不過感覺延時多久才好?要不要反覆以多重保險?)

此處順帶一提,js呼叫flash物件的方法,同樣最好等到flash載入就緒之後再呼叫。

那如何知曉flash何時已經載入就緒呢?

仍然推薦:在AS2中的_root.onLoad事件中利用ExternalInterface.call()通知js:Flash已經準備就緒!

AS3暫無研究,不過思路應該類似。

再順帶一提,有時找不到flash物件的方法,可能是因為安全限制的問題。

請嘗試修改flash物件HTML標籤的屬性

<param name="allowScriptAccess" value="always" />

<embed allowScriptAccess="always">

再就是有些情況下通過file://協議本地訪問,也會受到安全限制。

可嘗試釋出到http伺服器上再訪問(本地服務也可,只要是http://協議就行)。

參考資料:

這份資料內容現在看來好像有些過於複雜,某些做法貌似也並非最優,不過關鍵是它讓我想到了addCallback()“過早”執行的bug。