Flash 与 JavaScript的交互:常见问题分析与解决方法

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或者被遮盖。

  Transparent 模式

  透明模式,在这种模式下flash player会将stage的背景色alpha值将为0并且只会绘制stage上真实可见的对象,同样你也可以使用z-index来控制flash影片的深度值,但是与Opaque模式不同的是这样做会降低flash影片的回放效果,而且在9.0.115之前的flash player版本设置wmode=”opaque”或”transparent”会导致全屏模式失效。

了解了各种模式的实现方式和意义在以后的开发中就可以按照具体情况选择设置wmode属性的值了。

  在没有弹层被遮盖的问题的时候,大家尽量设置wmode为window模式,以提高flash的渲染效率和一些诡异的bug!