日期:2013-11-30  浏览次数:20830 次

最近做一个使用,flash和javascript之间互有调用。最后一次写点Actionscript也是在flash 7的时候了,因此按照我的想法,只需用fscommand和getUrl("javasciprt:.......")这种方式,flash和javascript之间互相调用应该不是什么大问题。

没多久就开始觉着本人落后了,Flash 8早曾经新增了ExternalInterface API专门处理flash与外部使用的交互,只需浏览器装有flash player,支持的范围应是更广。

ExternalInterface class能够运转的环境
Internet Explorer for Windows (5.0 and later)
Firefox 1.0 and later
Mozilla 1.7.5 and later
Netscape 8.0 and later
Safari 1.3 and later.
使用心得
ExternalInterface class仅仅只要两个方法:

addCallback(methodName:String, instance:Object, method:Function) : Boolean
Registers an ActionScript method as callable from the container. 
call(methodName:String, [parameter1:Object]) : Object
Calls a function exposed by the Flash Player container, passing 0 or more arguments. 

这两个方法的使用在手册有详细说明,使用范例可以从flash的安装路径例如C:\Program Files\Macromedia\Flash 8\Samples and Tutorials\Samples\ActionScript\ExternalAPI下面找到,没太大悬念。

碰到的问题
在IE浏览器下,将flash对象放在form标签之间,ExternalInterface class就会给你报javascript错,而firefox下完全正常,这几乎是让人很郁闷的事情,折腾了一天才找到问题缘由,可能是IE的Bug吧,这个在livedoc上有人反映过类似的问题。见下面的url:
http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002200.html

有人提出这样的处理办法,将下面这段javascript放在html里的flash之前:

<script type="text/javascript">
function ExternalInterfaceManager()
{
    this.registerMovie = function(movieName) {
        if(!window.fakeMovies) window.fakeMovies = new Array();
        window.fakeMovies[window.fakeMovies.length] = movieName;
    }
    this.initialize = function() {
        if(document.all)
        {
            if(window.fakeMovies)
            {
                for(i=0;i<window.fakeMovies.length;i++)
                {
                    window[window.fakeMovies[i]] = new Object();
                }
                window.onload = initializeExternalInterface;
            }
        }
 
    }
}
function initializeExternalInterface() {
    for(i=0;i<window.fakeMovies.length;i++) {
        var movieName = window.fakeMovies[i];
        var fakeMovie = window[movieName];
        var realMovie = document.getElementById(movieName);
 
        for(var method in fakeMovie) {
          &n