我有一个Flex客户端应用程序。当用户关闭浏览器时,我需要一个清理功能才能在Flex中运行。我在网上找到了以下解决方案,但它只适用于我的中途。我该怎么办呢? 提前感谢您的回复!
CustomEvent
已触发,但未执行。 CustomEvent.SEND_EVENTS
的EventHandler由Mate EventMap定义。所有处理程序都是调用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();
}
并在应用程序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);
}
}
答案 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 }