firefox、 chrome、ie8通过什么方式调用as3 addCallback

今天几乎花了4、5个小时来处理各种浏览器获取as3 addCallback函数的方法,firefox无论如何都不能调用as3中的ExternalInterface.addCallback方法, google基本都被我翻烂,最后偶然发现……。
这是嵌入html的代码:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="voice" type="application/x-shockwave-flash" data="mp3Player.swf'; ?>" style="border: 0px; overflow-y:hidden; -moz-outline-style: none; outline:none;" width="20px" height="20px">
<param name="movie" value="mp3Player.swf'; ?>">
<param name="wmode" value="#fff">
<param name="quality" value="low">
<param name="version" value="10.2">
<param name="allowScriptAccess" value="always">
<embed width="20" height="20" align="absmiddle" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" bgcolor="#fff" quality="high" menu="false" loop="false" src="http://sumsung753.blog.163.com/blog/mp3Player.swf'; ?>" name="voice" haspriority="true">
</object>

下面这个是adobe官方提供的方法:
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
在很多时候,上面的方法没有问题,ie8通过window.name获得embed,chrome/firefox通过document.id获得object,你会发现它们返回的都是player对象。
问题不在这里,如果你在三个浏览器中通过这个对象调用js定义的方法,都能成功;但要是想在js中调用as3中定义的向外提供的函数接口,chrome/ie8会成功,但firefox不行,它始终无法获得addCallback里面的方法。我试过很多方法后,最后发现令人非常诧异的结论,那就是firefox需要通过embed才能使js调用as3暴露的函数接口,我现在用的firefox版本是29.0.1,其它早期的版本是不是这样我不清楚。因此,你想在firefox中使用flash,嵌入object显示没有问题,但要使用里面的方法,得获取embed,因此明智的嵌入flash的做法就像开头代码所写的。一块使用object和embed。
var thisMovie = (function() {
return document[objectid] || window[embedname] || $('embed[name="voice"]')[0] || null;
})();

// 判断能否获取到as3方法

$('div.soundmark').find('a').mouseover(function(e){
if (typeof thisMovie.playMp3 == 'function') {
thisMovie.playMp3('voice5376395881b32.mp3');
}
});

如果你问上面的firefox已经通过document.id获取到了object就不会再执行下面的$('embed name'),是的,至于为什么这样等有有空再研究。

你可能感兴趣的:(callback)