3

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

症状

  • CustomEvent触发,但未执行。
    >> EventHandlerCustomEvent.SEND_EVENTS由 Mate EventMap 定义。处理程序所做的只是调用一个HTTPServiceInvoker. 在调试控制台中,我可以看到处理程序和 HTTPServiceInvoker 被触发,但既没有调用 theresultHandlers也没有faultHandlers调用 the 。我知道这个事件处理程序没有问题,因为当我CustomEvent.SEND_EVENTS在按钮单击处理程序中调度它时,它的行为完全符合我的预期)
  • 浏览器似乎在关闭之前等待清理功能完成。(所有痕迹都是在浏览器关闭之前打印出来的)

代码

我将以下内容添加到 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);
   }    

}

我的设置

  • 弹性生成器 3
  • Mate MVC 框架 (Mate_08_9.swc)
  • 闪存播放器 10
4

3 回答 3

2

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

您确定要离开此页面吗?

按 OK 继续,或按 Cancel 停留在当前页面。

如果用户选择确定,浏览器仍然会关闭。您可以使用该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();
}
于 2009-10-30T05:30:50.367 回答
1

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

时间越长越好,这取决于清理的时间紧迫性。如果您可以等待 5 分钟,那很好,否则请查看 1 分钟或 30 秒或您的应用程序所需的任何时间。

于 2009-10-30T16:45:43.513 回答
1

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

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 }
于 2009-11-02T10:18:28.240 回答