最近开发遇到的问题更偏向于js了。写了一个程序,让js与flash通讯,结果flash能调用js方法,但是js竟然不能调用flash方法。比如说我在flash中开放了接口“abcd”,但是用js调用 swf.abcd()。竟然报错说abcd不是方法。
这个问题是只出现在firefox下,ie下运行正常。于是开始狂使用alert了——后来发现firebug可以断点调试,长叹!
发现在firefox下通过document.getElmentById(swfid)能找到一个EmbedObject,可是就是找不到abcd方法。那估计就是在开放接口的时候出现问题了。首先想到的是可能会延迟:有可能在flash object初始化完毕前就执行了ExternalInterface.addCallback。这样自然就找不到方法了。于是使用了个定时器,在2秒后开放接口——2秒的时间估计够页面初始化Flash ObjectN个了吧!
发现还是不行,还是找不到abcd方法。倒~~~~~~ 然后去网上搜,搜到js获取flashobject方法总汇——其实总汇通总会,通过这个方法总会获取到flashobject的!如下:
window.document[movieName] // (on Mozilla browsers such as Netscape)
window[movieName] // (on Internet Explorer as of ver 5)
document.embeds[movieName] // Mozilla Netscape, Firefox or Opera
===================================================
function getFlashMovieObject(movieName){
if (window.document[movieName]){
return window.document[movieName];
}else if (navigator.appName.indexOf(”Microsoft Internet”)==-1){
if (document.embeds && document.embeds[movieName])
return document.embeds[movieName];
}else{
return document.getElementById(movieName);
}
}
===================================================
很高兴啊,赶紧copy!运行~~~~~~~ 靠,竟然还是能找到swf对象,但是找不到abcd方法。吃个饭,细想:估计还是开放接口错了。继续找资料,找到一篇好文章:http://www.akooc.com/article.asp?id=171。竟然也是搜狗的人,还开发过搜狗音乐盒,好!找到一段话:
如果object标签和embed表现用同样的id,通过js去访问flash对象的时候,IE会认不出,FF是没有问题的,至于为什么我不知道,所以,我当初在搜狐做视频播放器的时候采用这样的方式…………………………….所以,劝解大家一句,尽量不要用那个swfObejct.js这个东西,as和js交互起来很麻烦。你可以自己写一个简单的insertFlash.js…………..
晕,估计就是查找flash对象时对错号了。我也太相信swfobject.js了。动手自己写标签,将object和embed的id区分开来:
//===============================================
//添加pagekit
//===============================================
var url = “PageKit.swf”;
//添加flash变量
var vars = “pagekitInitData=”;
if(this["pagekitInitData"] != undefined) {
vars += this["pagekitInitData"];
}
var ieID = isIE ? pagekitID : pagekitID + “_ie”;
var ffID = isIE ? pagekitID + “_ff” : pagekitID;
var str = “”;
str += ‘<object classid=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ style=”position:absolute”‘;
//str += ‘ id=”‘ + ieID +’” width=”200″ height=”200″‘;
str += ‘ id=”‘ + ieID +’” width=”200″ height=”200″‘;
str += ‘ codebase=”http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab”>’;
str += ‘ <param name=”movie” value=”‘ + url +’” />’;
str += ‘ <param name=”quality” value=”high” />’;
str += ‘ <param name=”wmode” value=”transparent”/>’;
str += ‘ <param name=”allowScriptAccess” value=”always” />’;
str += ‘ <param name=”FlashVars” value=”‘ + vars + ‘” />’;
str += ‘ <embed src=”‘ + url +’” quality=”high”‘;
str += ‘ width=”200″ height=”200″ id=”‘ + ffID +’” align=”middle”‘;
str += ‘ play=”true”‘;
str += ‘ loop=”false”‘;
str += ‘ quality=”high”‘;
str += ‘ wmode=”transparent”‘;
str += ‘ FlashVars=”‘ + vars + ‘”‘;
str += ‘ allowScriptAccess=”always”‘;
str += ‘ type=”application/x-shockwave-flash”‘;
str += ‘ pluginspage=”http://www.adobe.com/go/getflashplayer”>’;
str += ‘ </embed>’;
str += ‘</object>’;
swfDiv.innerHTML = str;
运行!还真对得起这位高人的这篇文章,找到abcd方法了!!艰辛啊~~~~~~