Javascript 在flex中完成navigateToURL时发生的事件

Javascript 在flex中完成navigateToURL时发生的事件,javascript,flash,apache-flex,actionscript,navigatetourl,Javascript,Flash,Apache Flex,Actionscript,Navigatetourl,我正在使用navigateToURL从服务器下载文件。是否有可能知道导航URL何时完成,更像浏览器下载对话框何时打开 有时需要5秒钟才能完成,用户可能会感到困惑,并开始像精神病患者一样单击下载按钮,这可能会导致打开多个下载对话框 在结束之前,我想添加一些“请稍候”文本或其他内容(我已经有了,我只需要知道何时停止)。 也许可以使用javascript从ExternalInterface?获取信息,这有点疯狂,但我想不出任何其他方法:您可以将请求对象放入一个字典,该字典设置为弱引用键,然后检查是否删

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

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

在结束之前,我想添加一些“请稍候”文本或其他内容(我已经有了,我只需要知道何时停止)。

也许可以使用javascript从
ExternalInterface

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

然而,我不确定首先会发生什么,要么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
}
是否有可能知道navigateToURL何时完成,更多信息 比如浏览器下载对话框何时打开

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


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

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

代码如何知道何时取下钥匙?URLRequest无法调度事件,因为它不扩展EventDispatcher。未捕获错误事件适用于未捕获错误;但是,一旦请求发送到浏览器,我不相信Flex应用程序中会出现未捕获的错误。我不明白你的字典方法能实现什么。发送请求与完成请求非常不同;如果每个请求都立即完成;原始海报没有问题的基础。重新阅读原始问题,我认为你的解释是正确的。@wvxvw-Hmm,我尝试使用dictionary with
WeakKey
放置我的请求对象,但它似乎对我不起作用,或者可能我做错了什么,你能举个小例子吗?跟我试的差不多。不幸的是,urlRequest对象立即被释放。当定时器函数被调用时,即使下载对话框还没有打开,字典也已经是空的。如果原始海报打算下载一些东西到Flash应用程序中,这可能会起作用;但是如果他想让用户下载到他们自己的机器上,那就不行了。是的,我想你可以把内容下载到flash应用程序上,然后用上面的软件把它提供给用户。这不是最有效的方式,但它将允许将整个活动纳入其中。我想,理论上,一旦你在Flex应用程序中有了文件,你就可以使用FileReference.save;但在下载完成后,用户必须单击另一个按钮才能使其工作。如果没有用户交互,应用程序将无法初始化“保存”。啊,是的,忘记了用户交互要求。妈的,我还以为我在那儿呢。感谢Flextras的回复。请务必提名自己为版主。对不起,我不选择文件引用。它没有“打开”按钮。另一个启动
save()
方法的用户交互对我来说没什么大不了的。这就是我害怕的。关于JS,我不知道,不是该领域的专家,但也许有办法知道文件何时可以下载(浏览器标准下载对话框打开)。我稍后会尝试谷歌搜索。