如何检测是否在javascript中使用Flex或Flash创建了嵌入式swf

时间:2011-04-15 10:35:35

标签: javascript flex actionscript-3

是否有办法(在javascript中)检测是否使用Flash Professional或Flex创建了嵌入式.swf。

我们有一个包含多个标签的页面,每个标签都可以包含.swf。所有选项卡都在同一个HTML文件中定义,当包含的选项卡变为活动状态时,javascript框架会在swf上调用 .rewind() .play()

这适用于常规Flash动画,确保它们在打开选项卡时从头开始播放。然而,在使用Flex创建的swf上,倒带和播放会对Flex框架造成严重破坏,并且应用程序无法加载。

我们提出检测Flex的最佳方法是计算.swf具有的帧数。随着flex总是2.但这听起来不是最好的方式。

我们还尝试在Flex应用程序 preinitialize 事件中添加带有 ExternalInterface 的回调方法。不幸的是,这个事件在应用程序启动时很晚才被调用,javasctipt代码在Flex代码添加之前检查回调。

是否有其他方法可以检测(来自javascript).swf是否是使用Flex创建的?

2 个答案:

答案 0 :(得分:1)

简短的回答,没有。 Flex IS Flash;它只是Flash上​​的一个附加层,可以提高开发效率。

但是,可能有一个解决方案,但我需要知道您是否自己创建了swfs,以及是否可以修改它们。如果可以,我会使用ExternalInterface callback通过在JS中调用该函数来“播放”你的swf(即document.getDocumentById('swfId').someFunction();)。

另一种解决方案是让你的所有swfs在加载后立即播放,然后只在需要时加载它们(而不是预加载)。如果您需要“快退”,只需重新加载它们(如果您使用的是SWFObject,则应该很容易,只需删除并添加回来)。

答案 1 :(得分:0)

好的,回答我自己的问题, DownloadProgressBar (在第一帧中加载)可以自定义(重载)。

因此,这是自定义进度条,它为Javascript添加了一个isFlex()回调方法:

package flexidentifier {
    import flash.external.ExternalInterface;
    import mx.preloaders.DownloadProgressBar;

    public class FlexIdentifierDownloadProgressBar extends DownloadProgressBar {
        public function FlexIdentifierDownloadProgressBar() {
            super();
            ExternalInterface.addCallback("isFlex", callback);
        }

        protected function callback():String {
        return "true";
        }
    }
}

不要忘记将其添加到应用程序:

<s:Application xmlns:s="library://ns.adobe.com/flex/spark" preloader="flexidentifier.FlexIdentifierDownloadProgressBar">
</s:Application>

如果Adobe的人员把它放在Flex框架中开始,那就太好了。