当navigateToURL在flex中完成时的事件

时间:2012-06-11 18:45:04

标签: javascript flash flex actionscript navigatetourl

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

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

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

3 个答案:

答案 0 :(得分:1)

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

但是,我不确定首先会发生什么,要么将丢弃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
}

答案 1 :(得分:0)

  

有没有可能知道navigateToURL何时完成,更多   喜欢什么时候打开浏览器下载对话框?

不,没有。将请求传递到浏览器后; Flash Player不再具有任何控制权或访问权限。

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

答案 2 :(得分:0)

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

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