ExternalInterface.addCallback注冊的函數(shù)在瀏覽器中的兼容性問題
現(xiàn)在做一個(gè)小應(yīng)用,要求使用js調(diào)用flash中的函數(shù),就使用了ExternalInterface.addCallback函數(shù)。之前用過一次,按照官方API上的方法做了以后,發(fā)現(xiàn)只有IE是能正常調(diào)用的,其他瀏覽器都不行,但是上次只是試驗(yàn)階段,就沒有深究。這回就不行了,搞了兩天還是有點(diǎn)問題。下面就慢慢說一說吧。
首先真的是除了IE都不能使用,報(bào)錯(cuò)是在其他瀏覽器中找不到那個(gè)flash(js獲取的object為空),后來看了http://www.iamued.com/demo/flashjs/這篇文章后就明白了,重點(diǎn)在于object的id屬性, EMBED的name屬性及swliveconnect=”true”屬性,然后還修改了js獲取flash的方法。同時(shí)我還試驗(yàn)了這篇文章中提到的Play(),StopPlay()這些JS固有的控制flash的方法。這回以后,在IE和Opera中好用了。但是在FF、Chrome中除了Play(),StopPlay()這些方法是可用的,自己在flash中使用ExternalInterface.addCallback注冊的方法卻調(diào)用不成功,提示has no method 'flushTickets'(在flash中是這么寫的ExternalInterface.addCallback("flushTickets",flushTicketsforjs);)。
后來有人說用swfobject.js來嵌入swf會(huì)比較好(使用方法http://www.cnblogs.com/lunalord/archive/2011/03/03/1967992.html),于是就試了一把,結(jié)果還是一樣。
接著又看了這篇文章http://tech.cncms.com/tuxing/flash/93749.html,這里主要講的是要注意安全沙箱問題和swf是否完全加載的問題。我就把a(bǔ)llowScriptAccess的值由原來的sameDomain改為了always;在flash中添加Security.allowDomain("*")和Security.allowInsecureDomain("*");讓flash監(jiān)聽全部加載完后出現(xiàn)ready字樣。這樣修改后在FF和windows版的Safari中居然神奇的OK的,但是Chrome中還是那副屎樣。我開始懷疑是不是我電腦Chrome的問題(因?yàn)槲业碾娔X的Chrome使用video標(biāo)簽的時(shí)候放MP4只有聲音沒有圖像),然后就放到一個(gè)同事的電腦上去試了,結(jié)果他那的瀏覽器沒有一個(gè)測試成功的,真是崩潰啊。本著自欺欺人的態(tài)度,我認(rèn)為那是同事電腦的問題。
然后看了http://www.cuplayer.com/player/PlayerCodeAs/2012/0724310.html,這篇文章后我就try了一下,發(fā)在在Chrome中在注冊函數(shù)的時(shí)候是出現(xiàn)了SecurityError#2060的錯(cuò)誤,官方解釋:2060安全沙箱沖突:ExternalInterface 調(diào)用者 %1無法訪問 %2。我猜想可能是Chrome強(qiáng)制檢驗(yàn)安全沙箱了,之前一直都是本地運(yùn)行,所以在域上可能會(huì)有問題。那干脆就放到IIS中去試試。
結(jié)果……
結(jié)果……
結(jié)果真的可以了。猜想之前ff中的問題應(yīng)該也是這個(gè),只是域修改為通配符“*”后就好了。忙乎小一天,終于解決了!
下面放送代碼
flash部分
testTxt是在舞臺(tái)上的一個(gè)動(dòng)態(tài)文本。
package
{
import flash.display.MovieClip;
import flash.external.ExternalInterface;
import flash.system.System;
import flash.system.Security;
import flash.events.Event;
public class MapMain extends MovieClip
{
public function MapMain()
{
testTxt.text=String(ExternalInterface.available);
Security.allowDomain("*");
Security.allowInsecureDomain("*");
this.loaderInfo.addEventListener(Event.COMPLETE,onthisswfready);
try
{
ExternalInterface.addCallback("flushTickets",flushTicketsforjs);
}
catch(e:SecurityError)
{
testTxt.appendText("_"+e.toString());
}
}
private function onthisswfready(evt:Event):void
{
this.loaderInfo.removeEventListener(Event.COMPLETE,onthisswfready);
testTxt.appendText("_ready");
}
private function flushTicketsforjs():void
{
//由js中觸發(fā)主動(dòng)的更新數(shù)據(jù)
testTxt.text="數(shù)據(jù)已經(jīng)更新了";
}
}
}
html部分
</style>
<script type="text/javascript">
function onclickHandler()
{
thisMapMovie("mapff").flushTickets();
}
function onstopHandler()
{
thisMapMovie("mapff").StopPlay();
}
function onplayHandler()
{
thisMapMovie("mapff").Play();
}
function thisMapMovie(movieName)
{
if (window.document[movieName])
{
return window.document[movieName];
}
if (navigator.appName.indexOf("Microsoft Internet")==-1)
{
if (document.embeds &&document.embeds[movieName])
return document.embeds[movieName];
}
else // if (navigator.appName.indexOf("MicrosoftInternet")!=-1)
{
return document.getElementByIdx_x_x(movieName);
}
}
</script>
“<body>
<input type="button" value="刷新數(shù)據(jù)"onclick="onclickHandler();" />
<input type="button" value="停止"onclick="onstopHandler();" />
<input type="button" value="播放"onclick="onplayHandler();" />
<div id="flashContent">
<objectclassid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550"height="400" id="mapff" align="middle">
<param name="movie" value="mapf.swf"/>
<param name="quality" value="high"/>
<param name="bgcolor" value="#ffffff"/>
<param name="play" value="true"/>
<param name="loop" value="true"/>
<param name="wmode" value="window"/>
<param name="scale" value="showall"/>
<param name="menu" value="true"/>
<param name="devicefont" value="false"/>
<param name="salign" value=""/>
<param name="allowScriptAccess" value="always"/>
<param name="swliveconnect"value="true"/>
<embed play="true" swliveconnect="true" name="mapff"src="mapf.swf" quality="high" bgcolor="#FFFFFF" width="550"height="400" type="application/x-shockwave-flash"swliveconnect="true"pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"/>
</object>
</div>
</body>”
愛華網(wǎng)


