最近开发遇到的问题更偏向于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方法了!!艰辛啊~~~~~~
用了这么久的swfobject,从没发现有这样的问题。swfobject只会生成一个标签,要么是object,要么是embed,不会2者都有的。在这种情况下getElmentById()就够了。
另外,如果嵌入的flash是object里面还嵌入了embed,这样就可以了:
function getSWF(id){
var e=document.getElementById(id);
return (navigator.appName.indexOf(“Microsoft”) != -1)?e:e.getElementsByTagName(“embed”)[0];
}
我为这个问题头疼了四个小时……
这里是一个完美的函数,应当是官方的示例,已经在IE8和FF3中验证通过:
function getFlashMovieObject(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 {
return document.getElementById(movieName);
}
}
收藏备用
谢谢,问题解决了,困惑了很久。呵呵