2012-06-11 68 views
2

我正在使用navigateToURL從服務器下載文件。有沒有可能知道何時navigateToURL已完成,更像是何時瀏覽器下載對話框已打開?navigateToURL在flex中完成時的事件

有時需要5秒才能完成,用戶可能會感到困惑,並開始點擊下載按鈕,如精神病患者,這可能會導致打開多個下載對話框。

我想在結束之前添加一些「請稍候」文本或其他內容(我已經有一個,我只需要知道何時停止)。
也許可以使用javascript完成並從ExternalInterface獲取信息?

回答

0

反正是有可能的,知道什麼時候的navigateToUrl已經完成,更 當瀏覽器下載對話框開闢什麼樣的?

沒有,沒有。一旦你將請求傳遞給瀏覽器, Flash Player不再具有任何控制權或訪問權。

您提到使用ExternalInterface作爲可能解決方案的一部分,但您的HTML/JavaScript頁面如何知道下載已完成?

+0

這就是害怕。關於JS,我不知道,也不是該領域的專家,但也許有一些方法可以知道文件何時可以下載(打開瀏覽器標準下載對話框)。我會稍後嘗試使用Google。 – randomUser56789

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 
} 
+0

怎樣的代碼知道什麼時候取下鑰匙?由於URLRequest不擴展EventDispatcher,因此無法分派事件。未被捕獲的錯誤事件適用於未被捕獲的錯誤;但一旦請求被髮送到瀏覽器,我不相信uncaughtError將在Flex應用程序中發送。 – JeffryHouser

+0

我不明白你的字典方法會完成什麼。發送請求與完成請求非常不同;如果每個請求都立即完成;原始的海報不會有問題的基礎。 – JeffryHouser

+0

重新閱讀原始問題,我認爲你的解釋是正確的。 – JeffryHouser

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

+1

如果原始海報打算將某些內容下載到Flash應用程序中,這可能會有效;但是如果他打算用戶將其下載到他們自己的機器上,則不行。 – JeffryHouser

+0

是的,我認爲你可以將內容下載到Flash應用程序,然後使用上述內容向用戶提供。不是最有效的方式,但它將允許整個事件被合併。感謝您對Flextras的看法。 – Dom

+0

我想,理論上,一旦你在Flex應用程序中有文件,你可以使用FileReference.save;但用戶必須點擊另一個按鈕才能在下載完成後繼續工作。沒有用戶交互,應用程序將無法初始化「保存」。 – JeffryHouser