使用Javascript检测Flash应用程序是否正确加载?

8
我的产品会打开一个网页浏览器并将其指向包含本地Flash应用程序的HTML文件。我如何在程序中检测该文件是否成功加载,如果没有加载成功,又是什么异常?有没有一种使用JavaScript进行此操作的方法?
仅检查文件是否存在于磁盘上并不能保证其加载成功,因为其他错误也可能发生(可能涉及竞态条件)。
4个回答

12

回答自己的问题:https://sourceforge.net/forum/message.php?msg_id=5929756

  1. 定义一个Javascript函数,当Flash加载完成后应该调用该函数。
  2. 从Flash文件的顶部调用此方法。
  3. 使用计时器检测是否未调用回调函数。
  4. 最好从Flash调用Javascript函数而不是从Javascript调用Flash函数。无论哪种方式,都不能调用尚未加载的函数。更容易保证浏览器在从Flash调用之前已完成加载Javascript函数,而不是保证Flash在从Javascript调用之前已完成加载。

以下例子为示例:

  • 我正在使用swfobject嵌入Flash。
  • 我使用FlashVars来告诉Flash要调用哪个Javascript函数。如果页面上有多个Flash对象,则这非常有用。

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);
}

1
太棒了!这会对今天帮助很大 :D - Fahim Akhter

4
在无法修改swf且添加ExternalInterface不可行的情况下,您仍然可以使用Javascript来获取swf的状态。例如,您可以从Javascript调用document.getElementById(swf_id).PercentLoaded(),并等待它达到100。这样做不能告诉您如果swf加载失败时抛出了哪个异常,但至少您可以确定它是否已加载。其他有用的调用在此处找到:http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html

你不能简单地启动一个播放另一个SWF文件的SWF文件吗?你控制包装器,如果嵌套的SWF文件抛出异常,它会抛出一个异常。 - Gili
这个链接现在返回了404。 - Andrew Culver

3
实际上,在HTML页面加载完成后,Flash内容可能尚未完全加载。如果SWF没有完成加载,则似乎会显示为加载失败。
我通常推荐的方法是:当文档类构造函数被调用时,让SWF立即通过ExternalInterface调用JavaScript函数。基本上,假设除非该JS函数被调用,否则SWF加载失败。

好的,但我需要一种更具体的方法来检测是否发生了故障。超时不够可靠。 - Gili
这种方法的一个问题是您无法在同一页上拥有两个闪存实例。或者至少您不知道哪个实例触发了回调。 - zimbatm
要确定是哪个SWF触发了回调,您可以使用FlashVars将唯一字符串或数字作为标识符传递。当SWF调用JavaScript时,它也会在参数中传递标识符。 - Josh Tynjala

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接