在用户关闭浏览器时执行Flex清理功能

时间:2009-10-29 23:04:57

标签: javascript flex actionscript-3 httpservice mate

我有一个Flex客户端应用程序。当用户关闭浏览器时,我需要一个清理功能才能在Flex中运行。我在网上找到了以下解决方案,但它只适用于我的中途。我该怎么办呢? 提前感谢您的回复!

症状

       
  • CustomEvent已触发,但未执行。
    >> CustomEvent.SEND_EVENTS的EventHandler由Mate EventMap定义。所有处理程序都是调用HTTPServiceInvoker。在调试控制台中,我能够看到处理程序和HTTPServiceInvoker被触发,但resultHandlersfaultHandlers都没有被调用。我知道这个事件处理程序没有问题,因为当我在按钮单击处理程序中调度相同的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 个答案:

答案 0 :(得分:2)

不幸的是,没有可靠的方法来执行异步执行的清理功能。返回result方法后,HTTPService的fault / cleanUp事件异步发生。浏览器只等待onbeforeunload函数(js clean_up 函数)返回。除非您从该功能调用event.preventDefault(),否则该页面将被关闭。请注意,调用 preventDefault()将导致ok / cancel弹出窗口询问:

  

您确定要离开此页吗?

     

按“确定”继续,或按“取消”停留在当前页面上。

如果用户选择“确定”,则浏览器将关闭。您可以使用event.returnValue属性向popop添加自定义消息。

//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 :(得分:1)

您永远无法在100%的时间内可靠地检测到浏览器代码。如果您确实需要运行操作,那么最安全的操作方法是让客户端向服务器发送“我还活着”的消息。服务器需要按客户端跟踪时间,当客户端在指定的时间内没有发送消息时(有一些摆动空间),然后运行清理活动。

时间越长越好,这取决于清理的时间要求。如果您可以等待5分钟,那就太好了,否则请查看1分钟或30秒或您的应用所需的任何内容。

答案 2 :(得分:1)

在客户端清理会话的另一种方法是在as3中使用JavaScript和external.interface类。以下是示例代码:

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 }