`
a19905522
  • 浏览: 98750 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Flash 与 JavaScript的交互

 
阅读更多

最近整理了一下JS与Flash交互的一些常见问题,现总结一下分享给大家。有不对的地方欢迎大家拍砖啊。。。

内容大纲:

  1. 在页面中嵌入SWF文件

  2. JS与SWF的通讯方式

  3. 常见问题与解决方法

 

第一部分:在页面中嵌入SWF文件

  既然是Flash与JS的交互那肯定与他们的共同载体Web页面脱不了干系,也就是我们第一节的内容;

  我们先来看一看Flash文件是以什么样的方式出现在HTML页面当中的。

 

  第一种:古老且不符合W3C标准的嵌入方式:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="550" height="400" id=“demo1" align="middle">
2
    <param name="allowScriptAccess" value="sameDomain" />
3
    <param name="movie" value="mymovie.swf" />
4
    <param name="quality" value="high" />
5
    <param name="bgcolor" value="#ffffff" />
6
    <embed src="mymovie.swf" quality="high" bgcolor="#ffffff" width="550"  height="400" name=“demo1" align="middle" allowScriptAccess="sameDomain"  type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
7
</object>
 把以上代码拷贝到你的html文档里面,修改一下flash文件的路径,如:<param name="movie" value="xxx/xxx.swf" /> 和 <embed src="xxx/xxx.swf"  就可以在你的站点里面显示Flash的内容了,根据需要你可能还会修改一下 width、height、bgColor 等待属性。


  但是,当我们第一眼看到上面的代码时,是不是很晕啊,这是什么啊,这么长看上去好像有很多没有语意,而且有很多冗余的代码。的确这里面有很多让人不爽的地方,下面我们一一道来:

    1)冗余的代码:

      我们看到 width,height,quality,bgcolor align等等这些属性分别在 Object标签、param标签 和 embed 标签里面重复定义了两次同样的值。
 

    2)codebase 这个是什么意思,我需要么?

      Microsoft Internet Explorer 3.0 版和更高版本使用 CODEBASE 属性检测用户的计算机上安装了哪个版本的 Macromedia Flash Player ActiveX 控件。如果用户的版本比 CODEBASE 指定的版本旧, 那么 Internet Explorer 可自动从 CODEBASE 指定的位置下载并安装新版本的 Macromedia Flash Player。 - 来源
      通过上面的解释,我们知道它是来判断当前Flash文件需要的FlashPlayer的运行版本的。但是有更好的方法么? 
 

    3)为什么还要在object里套一层 embed标签。

      OBJECT标签是用于windows平台的IE浏览器的,而EMBED是用于windows和Macintosh平台下的Netscape Navigator浏览器以及Macintosh平台下的IE浏览器。windows平台的IE利用Activex控件来播放flash而其它的浏览器则使用Netscape插件技术来播放flash。
       也就是说embed是来告诉非 IE的浏览器 渲染当前的Flash文件所需要的信息。虽然embed解决了非IE浏览器渲染Flash文件的问题,但是它无法通过W3C的验证。
    为了解决这些不爽,我们找到了下面这种更好的解决方案。


  第二种嵌入方式:符合W3C 标准的嵌入方式

1 <object width="550" height="400" type="application/x-shockwave-flash"data="swf/fp9.swf" id="test2" style="visibility: visible;">
2     <param name="movie" value="swf/fp9.swf" />
3     <param name="allowScriptAccess" value="always" />
4     <param name="wmode" value="transparent" />
5     <param name="allowFullscreen" value="true" />
6     <param name="quality" value="high" />
7     <param name="flashvars" value="text=这是flashvars传入的数据啊" />
8 </object>

  相比上一段代码,这段的确减轻了我们眼睛的负担,没有了那么多多冗余代码,也符合W3C的标准了。细心的同学估计也看到了 flash文件的路径又被重复定义了两次,跟上面的情况一样,data是满足非IE, <param name="move" src='' />满足IE浏览器。

 

  综合上面的两种方式,虽然都解决了在页面中嵌入Flash的问题,而且第二中方法看起来更优雅,冗余代码很少,但是它们都有一个共同的问题:没有FlashPlayer检测;

  也就是说如果当前的浏览器里面没有安装Flash Player 或者 安装的浏览器版本不能满足要显示的Flash文件的最低的版本要求,就会导致浏览器不能正确的把Flash呈现出来。而此时屏幕前面的用户既没有看到正确的内容,也没有得到错误提示(当然,如果他压根没有安装FlashPlayer,浏览器会自动检测,并提示他安装FlashPlayer插件。)。那么我们怎么解决这个问题呢?为了解决这些问题,我们继续寻找。。。

 

  第三种豪华版嵌入方式登场:swfobject

  我们先来了解一下SwfObject是个什么东西。

  swfobject 是一个js类库,它封装了许多方法,用这些方法可以帮助你检查客户端的FlashPlayer环境和动、静态嵌入flash文件到页面中。
  方法简单,快捷。下面是它的优点:

  •  该模块中的JS脚本能够自动检测客户端机器上各种主流浏览器对Flash插件的支持情况。使得插入Flash媒体资源尽量简捷、安全。
  •  而且它非常符合搜索引擎优化的原则。能够避免您的HTML、XHTML中出现object、embed等非标准标签,从而符合更加标准。

     

  再来看看swfobjet的一个具体的例子:

1 <script type="text/javascript" src="swfobject.js"></script
2 <script type="text/javascript">
3     swfobject.embedSWF("test.swf", "swfid", "300", "120", "9.0.0"); 
4 </script>
5  
6 <div id="swfid"></div>

  是不是比上面的两种方法简单了许多。如果你只是嵌入一个Flash动画文件的画,上面的四句话都搞定了。

  这样是不是很爽,代码量少了很多。。。

 

  下面我们介绍一下SwfObject嵌入flash的详细方法:

01 <script type="text/javascript" src="swfobject.js"></script
02 <script type="text/javascript" language="javascript">
03 var <span style="color: #ff0000;">flashvars</span> = {
04     nameA:"hello",
05     nameB:"world"
06 }
07 var <span style="color: #ff0000;">params</span> = {
08     menu: "false",
09     allowFullscreen: "false",
10     allowScriptAccess: "always",
11     bgcolor: "#ffffff",
12     wmode: "window"
13 }
14 var <span style="color: #ff0000;">attributes</span> = {
15     id:"test"
16 }
17 swfobject.embedSWF("swf/test.swf", "<span style="color: #ff9900;">altContent</span>", "100%", "100%", "9.0.0", "swf/expressInstall.swf", <span style="color: #ff0000;">flashvars</span>, <span style="color: #ff0000;">params</span>, <span style="color: #ff0000;">attributes</span>);
18 </script>
19  
20 <!-- 要被flash文件替换的标签位置 -->
21 <div id="<span style="color: #ff9900;">altContent</span>">
22     <h1>Flashvars Demo</h1><!-- 此处为该flash的相关名称或功能描述 -->
23     <p><a href="http://www.adobe.com/go/getflashplayer">安装最新的FlashPlayer</a></p>
24 </div>
25 <!-- /要被flash文件替换的标签位置 -->

  flashvars   是一个json对象,为flash传递一些初始化信息;
  params   设置flash的一些渲染模式和背景颜色,缩放模式,右键菜单、是否允许flash访问js里面的方法等
  attributes   设置嵌入flash完成时object标签的id,name等属性

  

  现在我们详细介绍一下swfobject.embedSWF方法,该方法共需要10个参数,下面是详细介绍:

  swfUrl(String ,必须的)指定SWF的URL。
  id(String ,必须的)指定将会被Flash内容替换的HTML元素的id。
  width(String,必须的)指定SWF的宽。
  height(String,必须的)指定SWF的高。
  version(String,必须的)指定你发布的SWF对应的Flash Player版本(格式为:major.minor.release)。
  expressInstallSwfurl(String,可选)指定express install SWF的URL并激活Adobe express install。
  flashvars( Object ,可选)用name:value对指定你的flashvars。
  params(Object ,可选)用name:value对指定你的嵌套object元素的params。
  Attributes(Object, 可选)用name:value对指定object的属性。
  callbackFn(JavaScript function, 可选)定义一个在执行embedSWF方法后,嵌入flash成功或失败后都可以回调的js 函数

  对于不需要的参数可以省略,但是如果某个参数不需要,但是其后面需要设置某个具体的值的时候,请用 null 关键字占位,如:

  swfobject.embedSWF("swf/test.swf", "altContent", "100%", "100%", "9.0.0", null, flashvars, params, attributes);

 

  上面说了swfobject会自动判断客户端的FlashPlayer环境,在这里怎么没有体现呢?我们这就来介绍一下。swfobject检测客户端环境的方法体现在以下三个方面:

    1)<div id="altContent"></div>

    上面的例子我们可以看到在这个div里面还有一些关于你要嵌入的Flash的一些简单描述和一个现在FlashPlayer的链接地址。这个DIV很重要,它的作用就是在如果客户端没有安装FlashPlayer或者FlashPlayer的版本不够高,这段标签将不被替换,以达到提示用户这部门内容要安装FlashPlayer才能正确显示。
 

    2)swfobject.embedSWF方法里面的version参数;

    version参数告知了swfobject在满足那个Flahsplayer版本时才会替换上面的div标签,正确嵌入Flash文件,否则就不替换。


    3)swfobject.embedSWF方法里面的 
expressInstallSwfurl 参数

    expressInstallSwfurl 参数是一个Adobe提供的用于自动升级FlashPlyaer的一个swf文件,当客户端安装了FlashPlayer 6+ 的版本,又达不到 verison参数描述的版本时,swfobject就会在页面里面显示这个expressinstall.swf文件,它会提醒你是否要自动升级FlashPlayer。

 

  另外,swfobject 还提供了两个检测FlashPlayer版本的方法:

    swfobject.getFlashPlayerVersion()
    返回一个包含了已安装Flash Player主要版本(major:Number)、次要版本、minor:Number)、发行版本(release:Number)的JavaScript对象。

    
    swfobject.hasFlashPlayerVersion(versionStr)
    返回一个Boolean值,表明特定版本的Flash插件是否已被安装; 如:swfobject.hasFlashPlayerVersion(“9.0.124”)

 

    到此,第一部分就介绍完了,关于swfobject的更多信息可以查阅这里:http://code.google.com/p/swfobject/


    

第二部分:JS与SWF的通讯方式 

  所谓通讯就是信息的交换,这里我们谈的是js与Flash之间的数据交换。

  我们先来看一下 JS与Flash交换信息的三种方式。

    1.通过Flashvars

      Flashvars - Flash初始化信息的传递者,它由N组 名值对 组成;当你的flash文件需要某些初始信息的时候就需要用到它。

      如果你使用的是前两种嵌入方法,应像这样:<param name="flashvars" value="text=这是flashvars传入的数据啊" /> 用 param 标签传递信息;

      如果你使用的是 swfobject 就是用上面提到的,定义一个flashvars的变量然后在调用swfobject.embedSWF方法时传入这个变量;

      或者上面的这两种方法都可以在你要嵌入的Flash文件地址后面加上问号传递 入:"xxx.swf?name1=hello&name2=world ";

 

    2.JS调用Flash的方法,用参数传递信息给Flash或者得到Flash方法的返回信息

      Flash对象.flash方法名字(参数1,参数2, …);
      如:
        var flashObj = getFlashFun(“flashID”);
        var value = flashObj.flashFunName(args);

      注意:
      1.参数个数必须跟Flash里面的参数个数一致
      2.非同域下需要得到Flash内部的允许 Security.allowDomain(… domains)


       

    3.Flash调用js方法得到js方法的返回信息 或 通过参数传递信息给JS

      
ExternalInterface.call(js的函数名称,  ”参数1”,  ”参数2”, …);

       如:

       var value:String = ExternalInterface.call(“jsFunName“,  ”argument1”,  ”argument2”);


      注意非同域下设置 param 标签的 allowScriptAccess 属性的 value值为always,如:
        
var params = {

          allowScriptAccess: "always"
        }; 

        或:

        <param name="allowScriptAccess" value="always" />


 

第三部分:常见问题分析与解决方法 

  1. flash得不到正确的初始化参数

    –通过问号传递的参数被Flashvars方式传递的参数覆盖

     –某些带"&"符号的flashvars值没有进行encodeURIComponent 编码


  2. 
JS调用Flash方法失败

 

    –Flash没有初始化完成  - 延迟调用或者flash里面设置回调函数告知js flash文件初始化完成

 

    –获取flash对象的方法浏览器兼容性问题  - 修改获取flash对象的js方法

 

    –函数名不对应,或者Swf里面没有定义该方法

 

    –Flash没有允许跨域调用其内部方法

 

    –调用flash方法时参数数量不对应

    –在遨游,TT等国内著名山寨版浏览器中刷新后无法调用Flash方法 
      两个解决方案:

        1. 在flash文件地址后面加随机值不让Flash文件缓存;
        2. 在Flash里面延迟添加js的回调函数。

 


  3. Flash调用JS方法失败。

    –allowScriptAccess: “never“
    –跨域时没有设置:allowScriptAccess: “always“
    –FLASH调用JS的时候,JS对象还不存在



  4. 弹层被Flash覆盖了!

    –设置 wmode的值为: opaque 或 transparent;
      <param name=“wmode” value=“transparent” />
      var params = { wmode: " transparent“   }; 
    –或者把弹层也做成Flash的(这个可实施性不强。。。)


  
   5. Firefox下无法输入中文 
     
    –设置 wmode的值为: window;

    在这里我们简单了解一下 wmode:    

    window 模式

    默认情况下的显示模式,在这种模式下flash player有自己的窗口句柄,这就意味着flash影片是存在于Windows中的一个显示实例,并且是在浏览器核心显示窗口之上的,所以flash只是貌似显示在浏览器中,但这也是flash最快最有效率的渲染模式。由于他是独立于浏览器的HTML渲染表面,这就导致默认显示方式下flash总是会遮住位置与他重合的所有DHTML层。

但是大多数苹果电脑浏览器会允许DHTML层显示在flash之上,但当flash影片播放时会出现比较诡异的现象,比如DHTML层像被flash刮掉一块一样显示异常。
 

    Opaque 模式

    这是一种无窗口模式,在这种情况下flash player没有自己的窗口句柄,这就需要浏览器需要告诉flash player在浏览器的渲染表面绘制的时间和位置。这时flash影片就不会在高于浏览器HTML渲染表面而是与其他元素一样在同一个页面上,因此你就可以使用z-index值来控制DHTML元素是遮盖flash或者被遮盖。

分享到:
评论

相关推荐

    Qt和flash交互

    3. **Flash与JavaScript交互**: 虽然Qt是C++库,但Flash内容主要通过JavaScript与宿主环境(在这种情况下是Qt)进行交互。在Flash中,可以使用ActionScript的ExternalInterface类来暴露方法供JavaScript调用。同样,...

    flash与JavaScript的互联实例

    2. **Flash与JavaScript交互的必要性**: - **跨平台兼容**:虽然Flash在过去的几年中在移动设备上支持度下降,但JavaScript在所有现代浏览器中都得到了很好的支持。通过二者交互,可以确保在不支持Flash的设备上也...

    javascript与flash之间的交互(例子)

    JavaScript 可以通过这些对象的属性和方法与 Flash 进行交互,如 `getVariable` 和 `setVariable` 方法。 3. **Flash 发布设置**: 为了使 Flash 能够与 JavaScript 通信,需要在 Flash 的发布设置中启用 "Allow ...

    flash和javascript倒计时时钟

    总的来说,这个项目是学习和理解Flash与JavaScript交互的一个实例,对于想要了解早期Web开发技术或者提升前端技能的开发者来说,是一个有价值的参考资料。尽管现代Web开发趋势已转向更轻量级、跨平台的解决方案,但...

    FLASH与ASP交互实例

    本实例将详细讲解如何通过Flash与ASP进行交互,以实现更丰富的网页功能。 首先,ASP是一种服务器端脚本语言,由微软开发,用于构建动态网页。它允许开发者在HTML页面中嵌入VBScript或JScript代码,从而在服务器端...

    Flash与C#交互

    1. **Flash External Interface (AS3):** 这是Flash Player提供的一个API,允许ActionScript 3代码(Flash的编程语言)调用JavaScript函数,进而与网页中的C# Web服务或Ajax接口通信。C#服务端可以处理请求并返回...

    flex和javascript交互例子

    标题"flex和javascript交互例子"指向了这个主题的核心——如何在Flex应用中调用JavaScript函数,以及反过来在JavaScript中调用Flex的方法。这种技术通常被称为“Bridge”或“跨域通信”。 在Flex中,我们可以使用`...

    FLASH与JAVASCRIPT之间的通讯.pdf

    FLASH与JAVASCRIPT之间的通讯是指在网页上将FLASH电影与JAVASCRIPT脚本进行交互的技术。这种技术可以使得FLASH电影与JAVASCRIPT脚本进行信息交换,从而实现 FLASH电影的交互性。 在网页上,FLASH电影与JAVASCRIPT...

    Flash的Tab页

    1. **Flash与JavaScript交互**: - Flash中的ActionScript可以与网页中的JavaScript进行通信,通过外部接口(External Interface)允许两种语言之间传递数据和调用函数。在这个案例中,可能使用了ActionScript来...

    Flash与JS交互案例

    本案例“Flash与JS交互案例”展示了如何在网页中使SWF(Flash影片)与JavaScript进行数据交换,从而实现更丰富的用户体验。 首先,让我们了解Flash中的`ExternalInterface` API。这是Adobe Flash Player提供的一种...

    flash+java通信例子

    1. **Flash External Interface (外部接口)**:这是Flash与JavaScript交互的主要方式,允许Flash对象调用JavaScript函数,反之亦然。通过这个接口,Flash内容可以与Java通过JavaScript进行间接通信。 2. **...

    Javascript与flash交互通信基础教程

    本教程将介绍Flash与JavaScript交互通信的三种基础方式:从JavaScript到Flash的通信、从Flash到JavaScript的通信以及Flash之间的通信。 首先,需要了解能够实现这些通信技术的浏览器环境。并不是所有浏览器都支持...

    Flash与C#交互全集(bs与cs).rar

    在Flash中,我们可以使用ExternalInterface API来实现与JavaScript的交互,从而间接地与C#后台通信。在B/S场景下,JavaScript可以调用Web服务或PageMethods,C#端处理后返回结果,JavaScript再将这些结果传递给Flash...

    网页设计中flash对联代码(可关闭)

    6. `js`:这是一个JavaScript文件夹,里面可能包含实现Flash与JavaScript交互的代码。 在实际操作中,你需要将Flash对联代码嵌入到`index.html`中,通过设置`object`或`embed`标签来加载Flash文件,并确保...

    C# 与Flash交互简单示例【源码完美运行】

    7. **安全与限制**:由于Flash Player的安全策略,只有在同源策略允许的情况下,Flash才能与JavaScript交互。此外,外部接口的使用也受到一些其他限制,比如不能访问本地文件系统,除非用户明确授权。 8. **学习...

    flash与js交互

    在网页开发中,Flash与JavaScript(JS)的交互是一个常见的需求,特别是在富互联网应用程序(RIA)的场景下。这两种技术的交互使得动态内容和用户互动得以实现,弥补了彼此的不足。本文主要探讨如何实现Flash...

    C++ ATL控件与JavaScript交互

    本示例“C++ ATL控件与JavaScript交互”旨在展示如何通过ActiveX控件实现在浏览器中与JavaScript进行通信,以实现如文件上传进度条这样的高级功能。ActiveX控件是基于COM的,可以在Internet Explorer等支持ActiveX的...

    flash画流程图V1.1,支持web页面上运用flash技术画流程图

    “通过flash与javascript交互实现对流程图的控制”这部分,解释了用户如何与流程图互动。Flash通常负责图形的渲染和动画效果,而JavaScript则处理用户的输入事件,如点击、拖拽等,两者协同工作,使用户能够创建、...

    flash画流程图 V2.0 正式版,支持web页面上运用flash技术画流程图

    支持web页面上运用flash技术画流程图,通过flash与javascript交互实现对流程图的控制。需要部署到web服务器,使用方法参照graph1.htm。 首先说明,请注意,一定要注意,那些反应“此页需要 AC_RunActiveContent.js ...

    Javascript与Flash中的Socket交互

    JavaScript 与 Flash 中的 Socket 交互是网页开发中一种重要的技术,主要用于实现浏览器与服务器之间的低级别通信。在 Flash 中,Socket 类提供了与服务器进行双向数据流通信的能力,而 JavaScript 则可以用来控制 ...

Global site tag (gtag.js) - Google Analytics