我正在使用navigateToURL
從服務器下載文件。有沒有可能知道何時navigateToURL
已完成,更像是何時瀏覽器下載對話框已打開?navigateToURL在flex中完成時的事件
有時需要5秒才能完成,用戶可能會感到困惑,並開始點擊下載按鈕,如精神病患者,這可能會導致打開多個下載對話框。
我想在結束之前添加一些「請稍候」文本或其他內容(我已經有一個,我只需要知道何時停止)。
也許可以使用javascript完成並從ExternalInterface
獲取信息?
我正在使用navigateToURL
從服務器下載文件。有沒有可能知道何時navigateToURL
已完成,更像是何時瀏覽器下載對話框已打開?navigateToURL在flex中完成時的事件
有時需要5秒才能完成,用戶可能會感到困惑,並開始點擊下載按鈕,如精神病患者,這可能會導致打開多個下載對話框。
我想在結束之前添加一些「請稍候」文本或其他內容(我已經有一個,我只需要知道何時停止)。
也許可以使用javascript完成並從ExternalInterface
獲取信息?
反正是有可能的,知道什麼時候的navigateToUrl已經完成,更 當瀏覽器下載對話框開闢什麼樣的?
沒有,沒有。一旦你將請求傳遞給瀏覽器, Flash Player不再具有任何控制權或訪問權。
您提到使用ExternalInterface作爲可能解決方案的一部分,但您的HTML/JavaScript頁面如何知道下載已完成?
這有點瘋狂,但我想不出任何其他方式:你可以把請求對象放入一個設置爲弱引用鍵的字典中,然後檢查鍵是否被刪除。
但是,我不確定會先發生什麼,無論是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應用程序中發送。 – JeffryHouser
我不明白你的字典方法會完成什麼。發送請求與完成請求非常不同;如果每個請求都立即完成;原始的海報不會有問題的基礎。 – JeffryHouser
重新閱讀原始問題,我認爲你的解釋是正確的。 – JeffryHouser
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);
}
如果原始海報打算將某些內容下載到Flash應用程序中,這可能會有效;但是如果他打算用戶將其下載到他們自己的機器上,則不行。 – JeffryHouser
是的,我認爲你可以將內容下載到Flash應用程序,然後使用上述內容向用戶提供。不是最有效的方式,但它將允許整個事件被合併。感謝您對Flextras的看法。 – Dom
我想,理論上,一旦你在Flex應用程序中有文件,你可以使用FileReference.save;但用戶必須點擊另一個按鈕才能在下載完成後繼續工作。沒有用戶交互,應用程序將無法初始化「保存」。 – JeffryHouser
這就是害怕。關於JS,我不知道,也不是該領域的專家,但也許有一些方法可以知道文件何時可以下載(打開瀏覽器標準下載對話框)。我會稍後嘗試使用Google。 – randomUser56789