我有一个 Flex 客户端应用程序。当用户关闭浏览器时,我需要一个清理函数在 Flex 中运行。我在网上找到了以下解决方案,但它只对我有用。我该如何解决? 提前感谢您的任何回复!
症状
CustomEvent
触发,但未执行。
>>CustomEvent.SEND_EVENTS
的事件处理程序由 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);
}
}
我的设置
- FlexBuilder 3
- Mate MVC 框架 (Mate_08_9.swc)
- FlashPlayer 10
最佳答案
不幸的是,没有可靠的方法来执行这种异步执行的清理功能。 HTTPService 的result
/fault
事件在cleanUp
方法返回后异步发生。浏览器只会等待 onbeforeunload
函数(js clean_up 函数)返回。除非您从该函数调用 event.preventDefault()
,否则该页面将关闭。请注意,调用 preventDefault() 将导致 ok/cancel 弹出窗口询问:
Are you sure you want to navigate away from this page?
Press OK to continue, or Cancel to stay on the current page.
如果用户选择确定,浏览器将关闭。您可以使用 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();
}
关于javascript - 当用户关闭浏览器时执行 Flex 清理功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647088/