可以通过 Javascript 控制 SWF 吗?

Posted

技术标签:

【中文标题】可以通过 Javascript 控制 SWF 吗?【英文标题】:Possible to control SWF through Javascript? 【发布时间】:2011-06-07 05:20:38 【问题描述】:

情况如下:

客户希望循环播放的 SWF 文件在重新开始播放之前暂停两秒钟(这是一个不错的徽标构建动画,但徽标不会在屏幕上停留很长时间,因为电影会重复,因此用户无法长时间看到徽标。这无关紧要,但很好的背景故事。)

他们为我提供了 SWF 文件,但没有提供 FLA。当我询问 FLA 时,我被告知包含 FLA 的硬盘已崩溃,无法找回。所以,这几乎是一条死胡同。

在我去尝试反编译 SWF 和所有有趣的东西之前,我想知道是否有任何方法可以使用 htmljavascript 来完成。那就是:

    有 SWF 循环 在电影重新开始前暂停两秒钟

你怎么看?

【问题讨论】:

是的,真的做不到。 flash 电影需要 javascript 的钩子来告诉它执行操作。反编译你最好的选择。 【参考方案1】:

这在 javascript 中是不容易实现的,但是如果你将 swf 加载到另一个 swf 中就很容易了。然后,您可以访问原始 swf 的主时间线,并且可以控制它。如果你想控制一个名为 targetMovie.swf 的电影,你可以这样做:

var loader:Loader = new Loader();
loader.load(new URLRequest("targetMovie.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
addChild(loader);

var logoMovie:MovieClip;
function onComplete(evt:Event):void
    logoMovie = MovieClip(loader.content);
    // call pauseMovie at end of timeline
    logoMovie.addFrameScript(logoMovie.totalFrames-1, pauseMovie);

function pauseMovie():void
    logoMovie.stop();
    // delay for two seconds;
    setTimeout(function()
      logoMovie.play();   
        , 2000);

【讨论】:

真是个好主意。我什至没有考虑创建另一个加载该文件的 Flash 文件。唯一的缺点是有一个加载事件,因此您必须提供反馈并且用户必须等待。不过很好的解决方案。 另外,应该注意的是,工作中有人建议导入 After Effects 并以这种方式输出 SWF。这实际上也很有效。【参考方案2】:

您可以使用 swfObject 在 javascript 中完全模拟这一点。您需要计算动画的时间长度,添加两秒,然后将其设为脚本重新启动之前的时间。这是 homestarrunner 介绍的一个工作示例:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
        <script type="text/javascript" src="http://swfobject.googlecode.com/svn-history/r409/trunk/swfobject/swfobject.js"></script>

        <script type="text/javascript">
            $(document).ready(function()
              startSwf()
            )

            var restartTime = 24500 //in milliseconds
            function stopSwf()
              swfobject.removeSWF("swfLoop");
              startSwf();
            

            function startSwf() 
              $("body").append("<div id='swfLoop'></div>");
              swfobject.createSWF(data:"http://homestarrunner.com/newintro.swf", width:400, height:300, null, "swfLoop");
              setTimeout('stopSwf()', restartTime);
            
        </script>
    </head>
    <body></body>
</html>

在此处插入:http://htmledit.squarefree.com/

【讨论】:

我喜欢你使用 jQuery,但不确定它是否足够可靠。我觉得,如果 Flash 或类似的东西出现延迟,它很容易不同步。【参考方案3】:

试试这个http://www.permadi.com/tutorial/flashjscommand/

【讨论】:

以上是关于可以通过 Javascript 控制 SWF 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何以 SWF 格式创建播放和暂停?

HTML页面可以设置swf文件循环播放吗

jsp有办法实现word/excel的在线预览吗

Flash SWF,可以从浏览器内部读取文件内容吗?

如何将 javascript 函数从子 flash swf 文件插入 HTML 文档?

as3 从网络外部加载 swf 以控制从网络外部加载的 swf