智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

网页中swf与javascript交互注意事项

Posted on 2010-05-21 15:12  Bill Yuan  阅读(6034)  评论(0编辑  收藏  举报

一.利用Timer 类解决ExternalInterface.call对象为空的问题
       外部 API 最常见的用途之一就是允许 ActionScript 应用程序与 Web 浏览器进行通信。使用外部 API 时,ActionScript 方法可以调用使用 JavaScript 编写的代码,反之亦然。由于浏览器的复杂性及其内部呈现页的方式,因此根本无法保证 SWF 文档能够在 HTML 页中的第一个 JavaScript 运行之前注册它的回调。出于这个原因,在从 JavaScript 调用 SWF 文档中的函数之前,SWF 文档应总是调用 HTML 页,以通知它 SWF 文档已准备好接受连接。

        例如,通过 IMManager 类执行的一系列步骤,Introvert IM 可确定浏览器是否做好了通信的准备,并为通信准备 SWF 文件。第一个步骤(确定浏览器是否已做好通信准备)是在 IMManager 构造函数中执行的,如下所示:

代码
public function IMManager(initialStatus:IMStatus)
{
    _status 
= initialStatus;

    
// 检查容器能否使用外部 API。
    if (ExternalInterface.available)
    {
        
try
        {
            
// 这会调用 isContainerReady() 方法,该方法又调用
            
// 容器以查看是否已加载 Flash Player 以及
            
// 容器是否已经准备好接收来自 SWF 的调用。
            var containerReady:Boolean = isContainerReady();
            
if (containerReady)
            {
                
// 如果容器已准备就绪,则注册 SWF 的函数。
                setupCallbacks();
            }
            
else
            {
                
// 如果容器未准备就绪,则设置一个 Timer 以便
                
// 每隔 100 毫秒调用容器一次。在容器发出响应并表明已准备就绪之后,
                
// 该计时器将停止。
                var readyTimer:Timer = new Timer(100);
                 readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
                 readyTimer.start();
            }
        }
        ...
    }
    
else
    {
        trace(
"External interface is not available for this container.");
    }
}

 

二.设置网页中swf对象的属性allowScriptAccess='always',则可以在本地进行数据的测试,注意swf输出格式也必须是只访问本地文件

三.网页中获取swf对象必须先检测下浏览器的类型,以保证兼容性

代码
<script language="JavaScript">
...
function getSWF(movieName)
{
    
if (navigator.appName.indexOf("Microsoft"!= -1)
    {
        
return window[movieName];
    }
    
else
    {
        
return document[movieName];
    }
}
...
</script>

 

四.注意:Flash Player 当前不支持嵌入到 HTML 表单中的 SWF 文件。

五.着重强调js对应的函数参数一定要和flash中定义的函数参数保持一致,不然网页出错数据将无法交互,这一点一定要注意

六.关于直接给网页中的swf赋值
         我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标签。也就是OBJECT和EMBED标签。OBJECT标签是用于windows平台的IE浏览器的,而EMBED是用于windows和Macintosh平台下的Netscape Navigator浏览器以及Macintosh平台下的IE浏览器。windows平台的IE利用Activex控件来播放flash而其它的浏览器则使用Netscape插件技术来播放flash。
下面是简单的网页中插入flash的代码示例:

 

代码
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
codebase
="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" 
WIDTH
="550" HEIGHT="400" name="myMovieName"> 
<PARAM NAME=movie VALUE="myFlashMovie.swf"> 
<PARAM NAME=quality VALUE=high> 
<PARAM NAME=bgcolor VALUE=#FFFFFF> 
<EMBED src="/support/flash/ts/documents/myFlashMovie.swf" quality=high bgcolor=#FFFFFF WIDTH="550" HEIGHT="400" 
NAME
="myMovieName" ALIGN="" TYPE="application/x-shockwave-flash" 
PLUGINSPAGE
="http://www.macromedia.com/go/getflashplayer" >
</EMBED> 
</OBJECT>

         OBJECT标签是用于windows IE3.0及以后浏览器或者其它支持Activex控件的浏览器。“classid”和“codebase”属性必须要精确地按上例所示的写法写,它们告诉浏览器自动下载flash player的地址。如果你没有安装过flash player 那么IE3.0以后的浏览器会跳出一个提示框访问是否要自动安装flash player。当然,如果你不想让那些没有安装flash player的用户自动下载播放器,或许你可以省略掉这些代码。

         EMBED标签是用于Netscape Navigator2.0及以后的浏览器或其它支持Netscape插件的浏览器。“pluginspage”属性告诉浏览器下载flash player的地址,如果还没有安装flash player的话,用户安装完后需要重启浏览器才能正常使用。

         为了确保大多数浏览器能正常显示flash,你需要把EMBED标签嵌套放在OBJECT标签内,就如上面代码例子一样。支持Activex控件的浏览器将会忽略OBJECT标签内的EMBED标签。Netscape和使用插件的IE浏览器将只读取EMBED标签而不会识别OBJECT标签。也就是说,如果你省略了EMBED标签,那firefox就不能识别你的flash了(不过纳闷的是,省略了object只写embed,IE也能正常显示flash,呵呵,具体的再仔细看看了)。

Flash 直接赋值:

<param name="FlashVars" value="pic01Num=3&pic02Num=5">
<embed FlashVars="pic01Num=3&pic02Num=5"> 

也可以在js中进行赋值

代码
<script language="JavaScript">

function getSWF(movieName)
{
    
if (navigator.appName.indexOf("Microsoft"!= -1)
    {
        
return window[movieName];
    }
    
else
    {
        
return document[movieName];
    }
}
function init(){
   getSWF(
"myMovieName").FlashVars="pic01Num=3&pic02Num=5"
}
</script>

注意init()函数只能在<body onload="init()">中进行调用,swf对象已经初始化了才能保证顺利接受到外部的值