我有一个用 Actionscript 1 编写的旧程序,用 Flash 6 编译。它加载了 10 个其他模块,其中 3 个用 Actionscript 2 编写,用 Flash 8 编译。原始程序嵌入到 html 中,当 html 文件时完美运行在网络服务器上运行。但是如果我只是将 html 文件拖到我的浏览器中,3 个 AS2 模块将不会加载。或者,更准确地说,它们确实加载了,但我无法访问它们的功能。所有模块都使用“本地播放安全=仅访问本地文件”编译。我正在使用 Flash CS3 编译所有模块。在不将主加载模块重写为 AS2 的情况下,我能做些什么来解决这个问题?谢谢
2 回答
Flash 安全模型的规则有点神秘,但您似乎遇到了跨脚本限制。一种选择可能是解决它,例如通过安装 Apache(或其他)并通过http://localhost...
而不是file://...
. 但是,安全问题也可能得到解决。
首先,您可能想查看这篇文章,尤其是该页面中间的图表,其中列出了何时允许一个 SWF 访问另一个 SWF 的功能的基本规则。如图所示,使所有访问正常工作的最简单方法是让所有内容在“本地受信任”沙箱中正常运行。如何做到这一点在同一篇文章的第 4 页的下一部分进行了介绍。
我不确定这是否与您的问题有关,但混合 AVM1 SWF 文件可能会出现问题。
如果为版本 6 编译闪存 SWF 时未在输出设置中选择“针对版本 6r65 优化”选项,则生成的字节码很大程度上与为 v6r65 或更高版本编译的 AVM1 swf 文件不兼容(尤其是在使用 AS2 语言时,而不是AS1)。
这是因为在为这些早期版本编译时,对 _global 属性的任何引用都指向不同的位置,因此在 _global 命名空间中定义的属性对于针对更高版本的电影是不可见的,反之亦然。
鉴于类定义作为变量驻留在 _global 命名空间中,当混合针对位于 6r65 两侧的版本的 swf 文件时,这可能会产生很大的问题。
我记得通过将其中一个 SWF 文件中的 _global 引用复制到另一个 SWF 文件可见的位置来解决这个问题。
(在 6r65 之前)
class SomeClass
{
//
}
...
_global.someProp=123;
_level0.globalCopy=_global
(在 6r65 后)
trace(SomeClass) //undefined
trace(_global.someProp) //undefined
trace(_level0.globalCopy.SomeClass) //[object object] i.e. defined
trace(_level0.globalCopy.someProp) //123