2012-06-11 4 views
2

Я использую navigateToURL для загрузки файлов с сервера. Можно ли вообще узнать, когда закончилось navigateToURL, больше похоже на открытие диалогового окна загрузки браузера?Событие, когда navigateToURL закончил в flex

Иногда требуется 5 секунд для завершения, пользователь может запутаться и начать нажимать кнопку загрузки, как психопат, что может привести к открытию нескольких диалоговых окон загрузки.

Я хочу добавить текст «пожалуйста, подождите» или что-то еще до его завершения (у меня уже есть один, мне просто нужно знать, когда остановиться).
Возможно, это может быть сделано с помощью javascript и получить информацию от ExternalInterface?

ответ

0

Есть ли вообще возможности узнать, когда navigateToURL закончило, более как когда диалог браузера скачать открыли?

Нет, не существует. Как только вы передадите запрос в браузер; Flash Player больше не имеет никакого контроля или доступа к нему.

Вы упомянули использование ExternalInterface как часть возможного решения, но как ваша страница HTML/JavaScript узнает, что загрузка была завершена?

+0

Вот чего боялся. О JS, я не знаю, не эксперт в этой области, но, возможно, есть какой-то способ узнать, когда файл готов к загрузке (открывается диалоговое окно загрузки браузера. Я попробую погулять позже. – 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

Да, я думал, что вы можете загрузить контент в флеш-приложение, а затем передать его пользователю, используя приведенное выше. Не самый эффективный способ, но это позволит включить полное событие. Почувствую ваши мысли об этом Flextras. – Dom

+0

Я думаю, теоретически, как только у вас есть файл в приложении Flex, вы можете использовать FileReference.save; но пользователю придется нажать еще одну кнопку, чтобы это работало после завершения загрузки. Приложение не сможет инициализировать «сохранить» без взаимодействия с пользователем. – JeffryHouser