我正在使用navigateToURL
从服务器下载文件。是否有可能知道何时navigateToURL
完成,更像是浏览器下载对话框何时打开?
有时需要 5 秒才能完成,用户可能会感到困惑并开始像精神病患者一样单击下载按钮,这可能会导致打开多个下载对话框。
我想在它完成之前添加一些“请稍候”文本或其他内容(我已经有一个,我只需要知道何时停止)。
也许可以使用 javascript 来完成并从中获取信息ExternalInterface
?
我正在使用navigateToURL
从服务器下载文件。是否有可能知道何时navigateToURL
完成,更像是浏览器下载对话框何时打开?
有时需要 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);
}