【发布时间】:2012-05-15 14:04:47
【问题描述】:
我的产品打开一个网络浏览器并将其指向一个包含本地 Flash 应用程序的 HTML 文件。如何以编程方式检测此文件是否成功加载,如果没有则抛出什么异常?有没有办法使用 Javascript 来做到这一点?
从外部检查文件是否存在于磁盘上是不够的,因为我看到发生了其他故障(可能涉及竞争条件)。
【问题讨论】:
标签: javascript flash
我的产品打开一个网络浏览器并将其指向一个包含本地 Flash 应用程序的 HTML 文件。如何以编程方式检测此文件是否成功加载,如果没有则抛出什么异常?有没有办法使用 Javascript 来做到这一点?
从外部检查文件是否存在于磁盘上是不够的,因为我看到发生了其他故障(可能涉及竞争条件)。
【问题讨论】:
标签: javascript flash
回答我自己的问题:https://sourceforge.net/forum/message.php?msg_id=5929756
这是一个例子:
Flash
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
if (ExternalInterface.available)
{
var onLoaded:String = params["onLoaded"];
if (onLoaded != null)
ExternalInterface.call(onLoaded, true);
}
Javascript
var flashLoaded = false;
var flashTimer;
function onFlashLoaded()
{
flashLoaded = true;
clearTimeout(flashTimer);
}
function onFlashTimeout()
{
if (!isFlashLoaded)
{
// Remove the Flash object in case it is partially loaded
$("#videoFeed").empty();
$("#videoFeed").append('<div id="flashObject"></div>');
alert("Failed to load video player");
}
clearTimeout(flashTimer);
}
function connectToVideo()
{
var flashvars = {};
flashvars.onLoaded = "onFlashLoaded";
var params = {};
params.menu = false;
var attributes = {};
isFlashLoaded = false;
flashTimer = setTimeout("onFlashTimeout()", 5000);
swfobject.embedSWF("flash/VideoFeed.swf", "flashObject", "800", "600", "11", "expressInstall.swf", flashvars, params, attributes);
}
【讨论】:
在您无法修改 swf 并且无法添加 ExternalInterface 的情况下,您仍然可以使用 Javascript 来获取 swf 的状态。例如,您可以从 Javascript 中调用 document.getElementById(swf_id).PercentLoaded(),然后等待它变为 100。
这不会告诉你如果 swf 加载失败会引发什么异常,但至少你会确定它是否加载。在这里可以找到其他有用的调用: http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html
【讨论】:
实际上,当 HTML 页面加载完成时,Flash 内容可能还没有完全加载。如果 SWF 没有完成加载,那么它似乎已经失败。
我通常推荐的方法是,当调用文档类构造函数时,让 SWF 立即通过 ExternalInterface 调用 JavaScript 函数。基本上,假设 SWF 加载失败,除非调用该 JS 函数。
【讨论】:
根据 adobe ExternalInterface 文档: http://livedocs.adobe.com/flex/3/langref/flash/external/ExternalInterface.html 如果启用了弹出阻止程序,则某些 Web 浏览器会限制通过文档类构造函数中的 ExternalInterface 调用 Javascript 函数。
是否有其他解决方案可以检测 swf 电影何时已成功加载?
【讨论】: