从具有不同于默认值的另一个 swf 中打开一个 swf 文件
Posted
技术标签:
【中文标题】从具有不同于默认值的另一个 swf 中打开一个 swf 文件【英文标题】:Opening a swf file from within another swf with different than default values 【发布时间】:2010-09-21 03:48:48 【问题描述】:希望这不会被视为两次问同一个问题...
所以我正在开发一个 Flash 网站(在 AS2 中),它有一个外部索引 swf,它使用 loadMovie("subfoo1.swf", placeToShowSwf)
加载子 swf 文件。这些依次加载一个 xml 文件,该文件告诉它要加载什么内容。一切正常,但我们想在索引 swf 中添加一个按钮,该按钮打开一个子 swf 文件,其中一两个变量具有一两个不同的值。
不幸的是,只是添加了一个按钮
loadMovie("foo1.swf", placeToShowSwf);
placeToShowSwf.openProject(x);
不起作用,我认为是因为在未完全加载的文件上调用了 openProject(x)
。我知道代码没有问题,因为我在别处做了一个按钮,只调用placeToShowSwf.openProject(x)
并且没有任何问题。
我看到了两种解决方案,但我都不确定该怎么做。
-
创建 swf 文件时更改所需的值,例如类的构造函数。但是 swf 文件是否有某种构造函数?说
loadMovie(new foo1.swf(x), placeToShowSwf)
或类似的东西真的很好。
等到加载完 swf(可能还有 xml)之后,然后调用 placeToShowSwf.openProject(x)
。
任何人都对这些解决方案有任何指导,或者可能是我豌豆般的大脑无法理解的其他方式?
【问题讨论】:
【参考方案1】:您的做法是正确的,只是您需要等待 onLoadInit 回调,然后再尝试访问您的子影片剪辑。
【讨论】:
【参考方案2】:fenomas 的回答相当不错,但也有一个不那么“hacky” 如果您使用 AS2,则使用 MovieClipLoader 类加载您的 swfs。 它有你可以监听的事件,你会对 onLoadInit 感兴趣 事件。尽管人们可能会直觉它在加载过程中被触发 被初始化了,onLoadComplete应该是要使用的东西,不是这样的。
当所有字节下载完成时触发onLoadComplete 当所有字节完成下载和类时触发 onLoadInit 在加载的 swf 中被初始化(所以你可以访问加载的 swf 方法和属性)
查看 MovieClipLoader 中的代码示例 > as2.0 文档中的 onLoadInit
http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/js/html/wwhelp.htm?href=Part4_ASLR2.html
祝你好运
【讨论】:
【参考方案3】:解决此问题的三种简单方法:
(1) - 反转命令的方向。也就是说,在您的父 SWF 中:
projectType = "x";
loadMovie("foo1.swf", placeToShowSwf);
子(加载的)SWF 有这个:
openProject( _parent.projectType );
你明白了。如果子 SWF 是从不同的服务器加载的,这将不起作用,除非您解决跨域脚本问题。
(2) - 等待 MC 加载。不幸的是,AS2 没有内置的加载事件可供您使用,因此常用的方法是使用这样的 onEnterFrame:
someMovieClip.onEnterFrame = function()
if ( path_to.placeToShowSwf.openProject )
path_to.placeToShowSwf.openProject(x);
this.onEnterFrame = null;
如果您想在该方法可用时立即调用它;如果您想等到子 swf 完全加载,您需要检查子 SWF 的 getBytesLoaded()
和 getBytesTotal()
方法。
(3) 使用类似 MovieClipLoader 的组件进行加载 - 只需关注 the docs。从表面上看,这与 (2) 类似,但细节隐藏在 MovieClipLoader 类中。
【讨论】:
【参考方案4】:第二个是你应该做的。不幸的是,您仍然停留在 ActionScript 1 领域,而 ActionScript 3 已经推出几年了。所以我不知道确切的语法(我自己从 ActionScript 2 上的 flash 开始),但我会做 #2(等待 SWF 完成加载,然后告诉它要做什么)。
如果你不介意学习一点 AS2(通常可以混合使用 AS1 和 AS2,没有太大问题),那么你应该看看 MovieClipLoader。它提供回调来告诉您子 SWF 何时完成加载。
【讨论】:
以上是关于从具有不同于默认值的另一个 swf 中打开一个 swf 文件的主要内容,如果未能解决你的问题,请参考以下文章
C ++ - 指向具有相同地址但不同值的不同对象的另一个非静态成员的非静态void *成员
基于具有唯一值的数组创建多个动态选择过滤器以过滤 Vue.js 中的另一个数组