【问题标题】:Detect if Flash application loaded correctly using Javascript?检测是否使用 Javascript 正确加载了 Flash 应用程序?
【发布时间】:2012-05-15 14:04:47
【问题描述】:

我的产品打开一个网络浏览器并将其指向一个包含本地 Flash 应用程序的 HTML 文件。如何以编程方式检测此文件是否成功加载,如果没有则抛出什么异常?有没有办法使用 Javascript 来做到这一点?

从外部检查文件是否存在于磁盘上是不够的,因为我看到发生了其他故障(可能涉及竞争条件)。

【问题讨论】:

    标签: javascript flash


    【解决方案1】:

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

    1. 定义一个 Javascript 函数,在 Flash 加载时应该调用该函数。
    2. 从 Flash 文件的顶部调用此方法。
    3. 使用计时器来检测是否从未调用过回调。
    4. 宁愿从 Flash 调用 Javascript 函数,而不是从 Javascript 调用 Flash 函数。无论哪种方式,您都无法调用尚未加载的函数。在从 Flash 调用它之前保证浏览器已经完成加载您的 Javascript 函数比在从 Javascript 调用它之前保证 Flash 完成加载您的 Flash 函数要容易得多。

    这是一个例子:

    • 我正在使用 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);
    }
    

    【讨论】:

    • 太棒了!这对今天很有帮助:D
    【解决方案2】:

    在您无法修改 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 文件抛出异常,它会抛出异常。
    • 此链接现在返回 404。
    【解决方案3】:

    实际上,当 HTML 页面加载完成时,Flash 内容可能还没有完全加载。如果 SWF 没有完成加载,那么它似乎已经失败。

    我通常推荐的方法是,当调用文档类构造函数时,让 SWF 立即通过 ExternalInterface 调用 JavaScript 函数。基本上,假设 SWF 加载失败,除非调用该 JS 函数。

    【讨论】:

    • 很公平,但我需要一种更具体的方法来检测是否发生了故障。超时不够可靠。
    • 此方法的一个问题是您不能在同一页面上拥有两个 Flash 实例。或者至少你不知道是哪个触发了回调。
    • 要知道哪个 SWF 触发了回调,您可以使用 FlashVars 传入一个唯一的字符串或数字作为标识符。当 SWF 调用 JavaScript 时,它还会在参数中传递标识符。
    【解决方案4】:

    根据 adobe ExternalInterface 文档: http://livedocs.adobe.com/flex/3/langref/flash/external/ExternalInterface.html 如果启用了弹出阻止程序,则某些 Web 浏览器会限制通过文档类构造函数中的 ExternalInterface 调用 Javascript 函数。

    是否有其他解决方案可以检测 swf 电影何时已成功加载?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多