如何使用 swfobject 通知 HTML 容器 SWF 已完成

How to notify the HTML container that the SWF has finished, using swfobject

我正在将 Flash 对象(swf 文件)嵌入到 HTML 页面中。该对象以 as3 编写,并使用 Flash Builder 构建。它的目的是显示一些动画,然后结束。

能够通知容器动画已经完成对我来说真的很重要,但我找不到任何有用的东西。我正在使用 swfobject version 2.2.

在 Chrome 40 和 IE 11 上都试过了。

HTML(样本):

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
    <script type="text/javascript" src="js/swfobject.js"></script>
    <script type="text/javascript">
        function flashFinished() {alert('finished!');}
    </script>
    <script type="text/javascript">
        var flashVars = {}
        var flashParams = {allowscriptaccess : 'sameDomain'}
        var flashAttributes = {id : 'myflash', name : 'myflash'}
        swfobject.embedSWF('myflash.swf', 'flashObject', '960', '720', '9.0.0', 'swf/expressInstall.swf',
                flashVars, flashParams, flashAttributes);
    </script>
</head>
<body>
    <div id="flashObject">
        <p>To view this page please make sure that an updated version of Adobe Flash Player is installed.</p>
    </div>
</body>

AS3(示例):

package
{
    public class myflash extends Sprite
    {
        public function myflash()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            startPlay();
        }
        private function startPlay() : void {
            // do whatever, then make sure function finishPlay is called in the end
        }
        private function finishPlay(event:TimerEvent) : void {
            if (ExternalInterface.available)
                ExternalInterface.call('flashFinished');
        }
    }
}

我的 "flashFinished" 函数从未被调用过。谁能建议我做错了什么?谢谢!

如果 flash 代码的工作已经完成并且您不再需要它,只需终止 as3 中的 javascript:

var exitStr:String = "javascript:terminate()";
navigateToURL(new URLRequest(exitStr),"_self");

然后在 HTML 中添加一个 onUnload 函数,届时将调用该函数:

onUnload="flashFinished();"

注意:我将此代码与 swfobject v1.4 结合使用,不确定 v2.2

正如@akmozo 所建议的那样,由于本地环境的原因,这实际上是一个安全问题。我去了 Flash Player 的全局安全设置:

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html

并将包含所有 HTML 页面/SWF 对象的树的根文件夹添加到允许的位置。所以现在它也适用于本地。

为了避免 Flash 播放器阻止您的本地 swf 访问外部 URL(互联网,...)或与 javascript 通信或其他通常触发安全沙箱的操作违规错误,您必须将它(swf)添加到这样的受信任位置列表中:

对于 Flash Player PPAPI(如 Opera 和 Chrome):

  • 右键单击在浏览器中打开的 swf,然后 全局设置... :

这将打开 this page

  • 然后,如图所示,单击 编辑位置... 组合框,然后单击 添加位置 ,这将给你这个盒子:

您只需输入您的 swf 位置,或者它的父目录,或者像我在图像中所做的那样简单地输入整个分区。尽量避免使用 "Browse ..." 按钮,有时它不起作用(至少对我而言)。 确认并关闭页面并刷新您的swf。

对于 Flash Player ActiveX(如 IE)和 NPAPI(如 Firefox):

  • 右击你在浏览器中打开的swf,然后全局设置...,你也可以进入你的系统控制面板并打开Flash Player :

  • 然后转到高级选项卡并单击受信任的位置设置... 按钮 :

  • 然后您必须使用 Add.. 按钮添加 swf 位置 > 添加文件...添加文件夹...按钮 > select 您的 file/dir 或分区并按 OK, 确认并关闭所有对话框。

然后你只需要刷新你的页面。