如何使用 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 的 JavaScript 加载了 swf?