单个SWF应用程序实例。 AS3

时间:2011-08-10 09:23:16

标签: flash flex actionscript-3 actionscript

所以我在这个项目中有几个SWF,我需要找到一种方法来确保只能加载其中一个SWF的单个实例。

例如,您无法在2个不同的浏览器中打开2个不同的应用程序SWF,或同时在同一台计算机上打开选项卡。

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

private var lc:LocalConnection = new LocalConnection()

try
{
      lc.connect ("Main");
      //continue
}
catch (e:Error)
{
      //swf exists.
}

似乎IE9似乎没有立即破坏SWF。刷新页面可以显示“Swf Exists”,几秒钟之后,刷新可以解决问题。

有谁知道为什么会这样?

失败了。有没有人知道是否有退出事件?例如,当SWF终止时,有没有办法可以捕获该事件并在终止前手动关闭本地连接?

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

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

3 个答案:

答案 0 :(得分:1)

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

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

修改

从评论中添加我的东西:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

另外一个好处是,如果将静态变量的值设置为加载的swf的文档类,则还将引用加载的swf。