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。