Laan's steps..

Feed Rss

firefox下js与flash通讯的可恶

03.07.2009, flash, js, by .

最近开发遇到的问题更偏向于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方法了!!艰辛啊~~~~~~

firefox下js与flash通讯的可恶 有 4 条回应

  1. 用了这么久的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];
    }

    回复
  2. 我为这个问题头疼了四个小时……

    这里是一个完美的函数,应当是官方的示例,已经在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);
    }
    }

    回复
  3. 2012-07-13 在 09:22 fxjt111

    谢谢,问题解决了,困惑了很久。呵呵

    回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>