I have a Flex client application. I need a clean up function to run in Flex when the user closes the browser. I found the following solution on the net, but it only works half-way for me. How could I fix it? Thanks in advance for any responses!
CustomEvent
triggered, but not executed. CustomEvent.SEND_EVENTS
is defined by a Mate EventMap. All the handler does is to call an HTTPServiceInvoker
. In debug console, I'm able to see the handler and HTTPServiceInvoker being triggered, but neither the resultHandlers
nor the faultHandlers
were called. I know this event handler has no problem because when I dispatch the same CustomEvent.SEND_EVENTS
in a button click handler, it behaves exactly as I expected)
I added the following into the index.template.html
window.onbeforeunload = clean_up;
function clean_up()
{
var flex = document.${application} || window.${application};
flex.cleanUp();
}
And used the following in the application MXML file
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);
}
}
Unfortunately, there is no solid way of doing such clean up functions that execute asynchronously. The result
/fault
events of the HTTPService occur asynchronously after the cleanUp
method is returned. The browser waits only till the onbeforeunload
function (the js clean_up function) returns. Unless you call event.preventDefault()
from that function, the page will be closed. Note that calling preventDefault() will result in an ok/cancel popup asking:
Are you sure you want to navigate away from this page?
Press OK to continue, or Cancel to stay on the current page.
If the user selects OK, the browser will be closed nevertheless. You can use the event.returnValue
property to add a custom message to the 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();
}