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

Posted

技术标签:

【中文标题】如何使用 swfobject 通知 HTML 容器 SWF 已完成【英文标题】:How to notify the HTML container that the SWF has finished, using swfobject 【发布时间】:2015-04-25 21:40:24 【问题描述】:

我正在将 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”函数永远不会被调用。谁能建议我做错了什么?谢谢!

【问题讨论】:

我会使用 ExternalInterface 调用,您是否尝试过发出警报以查看它是否有效? -> ExternalInterface.call("alert","从 Flash 调用"); 我认为您的代码很好,但如果您在本地尝试它可能会遇到安全异常,因此请在 Web 服务器上尝试。 @Shaeldon SecurityError:错误 #2060:违反安全沙箱:ExternalInterface caller file:///C:/...../myflash.swf 无法访问 file:///C:/。 ..../page.html。毕竟,看起来 akmozo 是对的。 让我印象深刻的是,在将 allowscriptaccess 设置为“always”后,我遇到了同样的安全错误; adobe 文档说在这种情况下应该始终允许调用 【参考方案1】:

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

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

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

哪个会打开this page。

然后点击右侧的Global Security Settings panel链接,就会给你这个页面:

然后,如图所示,点击 Edit locations... 组合框,然后单击 Add location,这将为您提供以下框:

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

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

在浏览器中打开你的swf右键,然后全局设置...,你也可以到系统控制面板打开Flash Player:李>

然后转到高级选项卡并点击可信位置设置...按钮:

然后您必须使用 Add.. 按钮添加 swf 位置 > Add File...添加文件夹... 按钮 > 选择您的文件/目录或分区并按 确定确认并关闭所有对话框。

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我想给出一个答案来解释这一切 ;) 是的,这适用于 Flash Player PPAPI(如 Opera 和 Chrome)、Flash Player ActiveX(如 IE)和 NPAPI(如 firefox),它是在控制面板 > Flash Player > 高级选项卡 > 受信任的位置设置... 或直接右键单击 > 全局设置... @akmozo 是的,请,如果您发布旅游答案,我会选择并投票【参考方案3】:

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

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

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

onUnload="flashFinished();"

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

【讨论】:

SecurityError:错误 #2051:安全沙箱违规:file:///C:/...../myflash.swf 无法评估 file:///C:/.. 中的脚本 URL .../mypage.html(allowScriptAccess 是相同的域)。尝试的 URL 是 javascript:terminate()。

以上是关于如何使用 swfobject 通知 HTML 容器 SWF 已完成的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWFObject 加载 SWF 时调整其大小

HTML 使用swfObject

如何自定义使用 SWFobject 实现的播放器?

如何检查是不是使用带有 swfobject 的 JavaScript 加载了 swf?

如何防止 Javascript 菜单隐藏在 Flash 视频 (SWFObject) 下

VideoJS 和 swfobject 嵌入问题