Чтобы выполнить функцию очистки Flex, когда браузер закрыт пользователем - PullRequest
3 голосов
/ 30 октября 2009

У меня есть клиентское приложение Flex. Мне нужна функция очистки для запуска во Flex, когда пользователь закрывает браузер. Я нашел следующее решение в сети, но оно работает только наполовину. Как я мог это исправить? Заранее спасибо за любые ответы!

Симптомы

  • CustomEvent сработало, но не выполнено.
    >> EventHandler для CustomEvent.SEND_EVENTS определяется Mate EventMap. Все, что делает обработчик - это вызывает HTTPServiceInvoker. В консоли отладки я могу видеть, как запускается обработчик и HTTPServiceInvoker, но ни resultHandlers, ни faultHandlers не были вызваны. Я знаю, что у этого обработчика событий нет проблем, потому что когда я отправляю тот же CustomEvent.SEND_EVENTS в обработчике нажатия кнопки, он ведет себя точно так, как я ожидал)
  • Похоже, что браузер ожидает завершения функции cleanUp, прежде чем он закроется. (все следы были напечатаны до закрытия браузера)

код

Я добавил следующее в index.template.html

window.onbeforeunload = clean_up;

function clean_up()
{
 var flex = document.${application} || window.${application};
 flex.cleanUp();
}

И использовал следующее в приложении MXML-файл

import flash.external.ExternalInterface;

public function init():void {
ExternalInterface.addCallback("cleanUp",cleanUp);
}

public function cleanUp():void {   

   var newEvent:CustomEvent = new CustomEvent(CustomEvent.SEND_EVENTS);
   newEvent.requestObj = myFormModel;

   dispatchEvent(newEvent);

   // for testing purposes
   // to see whether the browser waits for Flex cleanup to finish before closing down   
   var i:int;
   for (i=0; i<10000; i++){
        trace(i);
   }    

}

Моя настройка

  • FlexBuilder 3
  • Mate MVC Framework (Mate_08_9.swc)
  • FlashPlayer 10

Ответы [ 3 ]

2 голосов
/ 30 октября 2009

К сожалению, не существует надежного способа выполнять такие функции очистки, которые выполняются асинхронно. События result / fault службы HTTPService происходят асинхронно после возврата метода cleanUp. Браузер ожидает только пока не вернется функция onbeforeunload (функция js clean_up ). Если вы не вызовете event.preventDefault() из этой функции, страница будет закрыта. Обратите внимание, что вызов protectDefault () приведет к появлению всплывающего окна ok / cancel:

Вы уверены, что хотите отойти от этой страницы?

Нажмите OK, чтобы продолжить, или Отмена, чтобы остаться на текущей странице.

Если пользователь выберет ОК, браузер все равно будет закрыт. Вы можете использовать свойство event.returnValue для добавления пользовательского сообщения в всплывающее окно.

//tested only in Firefox
window.addEventListener("beforeunload", onUnload, false);
function onUnload(e)
{
   e.returnValue = "Some text that you want inserted between " +
     "'Are you sure' and 'Press OK' lines";
   e.preventDefault();
}
1 голос
/ 02 ноября 2009

Альтернативный способ очистить сеанс на стороне клиента - использовать JavaScript и класс external.interface в as3. Вот пример кода:

JavaScript:

function cleanUp()
{

    var process;
    var swfID="customRightClick";
    if(navigator.appName.indexOf("Microsoft") != -1){
        process = window[swfID];
        }else
    {
        process = document[swfID];
    }
    process.cleanUp();
}

и в классе as3, где определена функция очистки, используйте это:

import flash.external.ExternalInterface;

if (ExternalInterface.available)
{
    ExternalInterface.addCallback("cleanUp", cleanUp);
}

function cleanUp():void {// your code }
1 голос
/ 30 октября 2009

Вы никогда не сможете надежно определять код браузера 100% времени. Если вам действительно нужно выполнить действия, то самый безопасный способ действий - это заставить клиентов отправлять на сервер сообщения «Я все еще жив». Сервер должен отслеживать время по клиенту, а когда клиент не отправляет сообщение в течение указанного промежутка времени (с некоторым пространством для маневра), затем выполнить операции очистки.

Чем дольше вы проводите время, тем лучше, это зависит от того, насколько критичной является очистка. Если вам не терпится подождать 5 минут, это здорово, в противном случае посмотрите на 1 минуту или 30 секунд или все, что требуется для вашего приложения.

...