【问题标题】:Event when navigateToURL has finished in flex当 navigateToURL 在 flex 中完成时的事件
【发布时间】:2012-06-11 18:45:03
【问题描述】:

我正在使用navigateToURL 从服务器下载文件。是否有可能知道navigateToURL 何时完成,更像是浏览器下载对话框何时打开?

有时需要 5 秒才能完成,用户可能会感到困惑并开始像精神病患者一样单击下载按钮,这可能会导致打开多个下载对话框。

我想在它完成之前添加一些“请稍候”文本或其他内容(我已经有了,我只需要知道何时停止)。
也许可以使用 javascript 并从ExternalInterface 获取信息?

【问题讨论】:

    标签: javascript flash apache-flex actionscript navigatetourl


    【解决方案1】:

    这有点疯狂,但我想不出任何其他方法:您可以将请求对象放入设置为弱引用键的字典中,然后检查是否删除了键。

    但是,我不确定首先会发生什么,要么释放 SWF 本身,要么清理字典。考虑到函数的一次性性,对请求对象的引用也可能不会被删除,因为它被假定与整个 SWF 一起被删除。

    我知道的另一件事是,未捕获的错误事件将捕获来自 navigateToURL 的事件 - 不是很有帮助,但如果它不起作用,至少可以为您提供指示。

    我能想到的更简单的事情 - 只需在短时间内禁用按钮,例如 1-2 秒。如果它有效,没有人会看到延迟,如果没有,他们将无法经常按下它。

    private var _requestStore:Dictionary = new Dictionary(true);
    private var _timer:Timer = new Timer(10);
    . . .
    _timer.addEventListener(TimerEvent.TIMER, timerHandler);
    . . .
    public function openURL(url:String):void
    {
        var request:URLRequest = new URLRequest(url);
        _requestStore[request] = true;
        _timer.start();
        navigateToURL(request);
    }
    
    private function timerHandler(event:TimerEvent):void
    {
        var found:Boolean;
        for (var o:Object in _requestStore)
        {
             found = true;
             break;
        }
        if (!found) // the request got disposed
    }
    

    【讨论】:

    • 代码如何知道何时删除密钥? URLRequest 不能调度事件,因为它没有扩展 EventDispatcher。未捕获的错误事件适用于未捕获的错误;但是一旦请求被发送到浏览器,我不相信 uncaughtError 会在 Flex 应用程序中调度。
    • 我不明白你的字典方法会完成什么。发送请求与完成请求有很大不同;如果每个请求都立即完成;原始发帖人没有提出问题的依据。
    • 重新阅读原问题,我认为你的解释是正确的。
    • @wvxvw 嗯,我尝试使用字典和WeakKey 放置我的请求对象,但它似乎对我不起作用,或者我做错了什么,你能举个小例子还是什么?
    • 和我试过的差不多。不幸的是 urlRequest 对象被立即释放。调用计时器函数时,即使下载对话框仍未打开,字典也已为空。
    【解决方案2】:

    是否有可能知道 navigateToURL 何时完成,更多 比如浏览器下载对话框打开的时候?

    不,没有。一旦您将请求传递到浏览器; Flash Player 不再对其拥有任何控制或访问权限。

    您提到使用 ExternalInterface 作为可能的解决方案的一部分,但是您的 HTML/JavaScript 页面如何知道下载已完成?

    【讨论】:

    • 这就是害怕的。关于 JS,我不知道,不是该领域的专家,但也许有一些方法可以知道文件何时可以下载(浏览器标准下载对话框打开)。我稍后会尝试使用谷歌搜索。
    【解决方案3】:

    navigateToURL 不会触发完整事件。尝试使用 Adob​​e 帮助文档中的此事件:

    public function URLRequestExample() {
            loader = new URLLoader();
            configureListeners(loader);
    
            var request:URLRequest = new URLRequest("XMLFile.xml");
            try {
                loader.load(request);
            } catch (error:Error) {
                trace("Unable to load requested document.");
            }
        }
    
        private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        }
    

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLRequest.html#includeExamplesSummary

    【讨论】:

    • 如果原始发布者打算将某些内容下载到 Flash 应用程序中,这可能会起作用;但如果他打算让用户将其下载到自己的机器上,则不会。
    • 是的,我在想您可以将内容下载到 Flash 应用程序,然后使用上述方法将其提供给用户。不是最有效的方式,但它允许合并完整的事件。非常感谢您对 Flextras 的看法。
    • 我想,理论上,一旦您在 Flex 应用程序中拥有该文件,您就可以使用 FileReference.save;但是用户必须在下载完成后单击另一个按钮才能工作。没有用户交互,该应用将无法初始化“保存”。
    • 啊,是的,忘记了用户交互要求。该死的,我以为我那里有东西。感谢 Flextras 的回复。请务必提名自己为版主。
    • 抱歉,FileReference 不适合我。它没有“打开”按钮。启动save() 方法的另一个用户交互对我来说没什么大不了的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2011-06-28
    • 1970-01-01
    • 2013-11-12
    • 2010-09-06
    • 2010-10-29
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多