Flash 单个SWF应用程序实例。AS3

Flash 单个SWF应用程序实例。AS3,flash,apache-flex,actionscript-3,actionscript,Flash,Apache Flex,Actionscript 3,Actionscript,所以我在这个项目中有几个主权财富基金,我需要找到一种方法来确保只有一个主权财富基金的单一实例可以加载 例如,您不能在两个不同的浏览器中打开两个不同的应用程序SWF,也不能同时在同一台计算机上打开两个选项卡 LocalConnection似乎是解决此问题的最佳解决方案,但是,Internet Explorer 9遇到了问题 private var lc:LocalConnection = new LocalConnection() try { lc.connect ("Main");

所以我在这个项目中有几个主权财富基金,我需要找到一种方法来确保只有一个主权财富基金的单一实例可以加载

例如,您不能在两个不同的浏览器中打开两个不同的应用程序SWF,也不能同时在同一台计算机上打开两个选项卡

LocalConnection似乎是解决此问题的最佳解决方案,但是,Internet Explorer 9遇到了问题

private var lc:LocalConnection = new LocalConnection()

try
{
      lc.connect ("Main");
      //continue
}
catch (e:Error)
{
      //swf exists.
}
IE9似乎并没有立即摧毁SWF。刷新页面会显示“Swf存在”,几秒钟后,刷新会修复问题

有人知道为什么会这样吗

如果做不到这一点。有人知道是否有退出事件吗?例如,当SWF终止时,是否有办法捕获该事件并在终止前手动关闭本地连接

onApplicationExit(e:Event): void
{
    lc.close();
}

最后,是否有人可以使用任何其他方法来尝试实现单个swf实例?

无论是否有一个swf已打开,您都可以使用SharedObject来存储标志。如果该标志设置为true,则在启动时关闭第二个swf

并在第一个SWF关闭时重置标志。 可能比LocalConnection更容易处理

编辑

从评论中添加我的内容:


因为SharedObject没有您可以设置的生命周期,所以您可以使用某种超时:为您的SWF创建一个唯一的ID,并每隔5秒将ID和时间码写入SharedObject。每当SWF打开时,您都会比较ID并检查时间码os是否超过5-10秒。如果是,请将其关闭,如果不是,请覆盖sharedobject。类似这样的事情…

没有直接的方法可以用flash捕捉页面关闭事件,但是javascript为您提供了一种方法。我会尝试以下方法:


在网页中添加window.onbeforeunload javascript侦听器,并使用它调用flash电影中的清理功能(这将立即关闭本地连接)。要使flash电影收听javascript调用,请查看ExternalInterface.addCallback。

在每个加载的swf中,在初始化该剪辑时设置一个静态变量。然后在主剪辑中,检查该变量是否不等于null。如果是这种情况,您已经加载了该swf,可以忽略该加载


另外,如果您将静态变量的值设置为加载的swf的文档类,那么还将有一个对加载的swf的引用

谢谢你,派克。但这不也可以归结为某种阶段吗?退出事件?因为如果用户关闭浏览器,就无法重置共享对象上的标志?(也就是说,没有办法关闭本地连接。)嗯,你说得对。我认为IE是另一个问题。也许您可以使用某种超时:为您的SWF创建一个唯一的ID,并每隔5秒将ID和时间码写入SharedObject。每当SWF打开时,您都会比较ID并检查时间码os是否超过5-10秒。如果是,请将其关闭,如果不是,请覆盖sharedobject。像这样的事。。。