一聚教程网:一个值得你收藏的教程网站

热门教程

javascript访问SWF的函数兼容IE、FF和Chrome

时间:2022-06-28 22:55:46 编辑:袖梨 来源:一聚教程网

如果要JS访问Flash中的函数,需要用addCallBack注册一个回调函数,让JS去调用(AS2例子)

 代码如下 复制代码

import flash.external.*;
var methodName:String = "SetImgPath";//JS需要调用的函数名字
var instance:Object = null;
var method:Function = extractstr;//Flash中实际的函数名字,参数忽略,但是你调用的时候要记得有参数的要加上
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
trace(wasSuccessful+"-callback")

我们可以trace一下,这个时候如果是true,表示注册成功

OK,下面web中试用一下:

 代码如下 复制代码


  

   
                               
    
    
    
    
    
    
    
    
    
    
    
     
                                       
     
     
     
     
     
     
     
     
     
     
    
     
     

    
    

    
   

  

这面的WEB代码我们用Adobe Flash自动生成的,然后写相应的JS代码:

 代码如下 复制代码

 

OK,我们在Web中加一个button来调用这个flashcall:

测试一下:

IE6,7,8,9一切正常

FF:失败

Chrome:失败

失败原因:SetImgPath不是函数,(is not a function /not defined)

这就很奇怪了,我们可以用一个alert,来输出thisMovie("123"):alert(thisMovie("123"));

输出结果并不是Null,说明已经找到了我们的Flash,但是为啥FF和Chrome就总是找不到函数呢?

逛了各大论坛,比较一致的说法是addCallback必须要是flash加载完毕才能注册成功,好吧,我们加一个settimeout函数,判断是否加载成功,我们改一下上面的flashcall:

 代码如下 复制代码

function flashcall(str){   
try{   
       thisMovie("123").SetImgPath(str);//注意,123是上面的ID,而SetImgPath是我们Flash中的注册的回调函数
    }cache(e){
       settimeout("flashcall(str)",100 );
}
}

恩,我们用个settimeout,每隔100毫秒去调用一次,如果异常就持续调用,直到成功为止!

遗憾的是,始终不成功,程序进入死循环!

崩溃中

 通过查阅各种资料,终于找到了原因:

FF中浏览器只认识embed标记,所以如果你用getElementById获 flash的时候,需要给embed做ID标记,而IE是认识object标记的 ,所以你需要在object上的ID做上你的标记

明白了吗?原来在FF和Chrome中,Flash必须用embed才能识别出他的ID,用Object标签是无法识别ID的,我用的Html是Flash自动生成的,都是Object标签,害我调试了一个下午,才明白原来问题出在这里。

知道原因了,就好处理了,改标签:

 代码如下 复制代码

 
 
 
 
       
 

热门栏目