我有一个Flex客户应用程序。我需要一个清理功能的运行在Flex当户关闭浏览器。我发现了以下解决方案在网上,但是只工作一半的我。我怎么可能解决这个问题? 预先感谢任何答复!

症状

  • CustomEvent 触发的,但不执行。
    >>处于 CustomEvent.SEND_EVENTS 定义是通过一个伴侣以曲线形式.所有的处理程序不是为了叫一个 HTTPServiceInvoker.在调试台,我能看到的处理程序和HTTPServiceInvoker被触发,但既没有 resultHandlers 也没有 faultHandlers 被称为。我知道这个事件处理程序没有问题的,因为当我派遣一样 CustomEvent.SEND_EVENTS 在按一下按钮处理程序,它表现,正是因为我期望)
  • 浏览器似乎要等待清理的功能,以完成之前它关闭。(所有痕迹印刷的前浏览器将关闭)

代码

我加入下面进入index.template.html

window.onbeforeunload = clean_up;

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

并且用下列中的应用单的文件

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);
   }    

}

我设置的

  • FlexBuilder3
  • 伙计软框架(Mate_08_9.swc)
  • 权的个人所有10
有帮助吗?

解决方案

不幸的是,没有坚实的方式做这样的清理职能执行的异步的。的 result/fault 事件为httpservice)异步地发生后 cleanUp 方法返回。浏览器等待,直到的 onbeforeunload 功能(js clean_up 功能)返回。除非你打电话 event.preventDefault() 从这一职能,该网页将被关闭。注意到呼叫 preventDefault() 将导致在确定/取消弹问:

你确定要离开这一页?

按确定的继续,或者取消留在目前的页。

如果用户选择确定,浏览器将被关闭,不过。你可以使用 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();
}

其他提示

你永远不能够可靠地探测浏览器码100%的时间。如果你真的需要运行的行动,然后安全的行动当然是向客户发送"我还活着"信息的服务器。服务器的需求来跟踪时间通过客户和当客户不能发送信息在特定时间(与一些回旋余地),然后运行清洁活动。

你不再让时间的更好的,这取决于时间的重要的清理。如果你可以逃脱等待5分钟这就是伟大的否则看起来在1分钟30秒钟或什么的需要你的应用程序。

备选办法清理的会议对客户的侧是使用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 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top