Detecting when a user leaves a page / browser in Flex - apache-flex

I have an HTML wrapper that contains a Flex application, is there an Event that I can listen on, that is triggered when a user leaves the HTML wrapper either by navigation arrows or closing the browser?
Thanks.

You can also listen for Event.ACTIVATE and Event.DEACTIVATE in Flash. All EventDispatchers receive these events when Flash/AIR gains or loses focus from the OS.
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/EventDispatcher.html#event:deactivate
This is very helpful for when you you provide a link that opens a new window and you want to reduce functionality and load (pause and mute a video for example) and then resume when the user comes back.

Edit: I realized this may not be what you're asking for exactly, but I'll leave it in in case it's helpful for anyone looking for it. Also note that you can perform other actions in the onbeforeunload event that will generally be reliably executed before the user accesses the confirmation dialog, unless your unload routine is overly complex (in which case you should consider altering your design anyway).
onbeforeunload lets you interrupt page unload:
window.onbeforeunload = function(e) {
// Browser will pop up a confirmation dialog, with some text before
// and after your return string; try it in different browsers to
// see how they behave.
return 'String to confirm';
}

There is Body.onUnload, but i'm not sure how reliable it actually is.

The closest thing I've found for this is the javascript window.onunload event. However, you can't really listen for this within the Flex app, as the app may not be running anymore by the time the unload method is called. We've used it to signal to other parts of the page via javascript that the app was unloaded though, so depending on what you need to do that might be enough.

The question is, what do you need to do when the user navigates away?
If you need to perform an action on your server, then the best way to handle this is to open a Socket() when your swf initializes, and then when the user navigates away, that socket will be terminated, and the server can detect that and perform additional logic.
If you need to perform a client side operation, like saving a SharedObject, then you can't rely on a "just one last thing" event to the plugin, since there are alot of avenues to closing out a plugin session. In that case, your best bet is to continually be saving SharedObjects every few seconds.

Related

What is the event available for canceling editing?

I want to do something when the author opens a page, makes some changes and closes without saving.
I am expecting an event like close or cancel, but I can't find any event like that.
Which event should I subscribe to in this scenario?
There is no close or cancel event and since the user did not perform a save there is no event called at all (unless it is an existing item, then the close would trigger an undo-checkout). Please note that the user does get a warning when he tries to close a window without saving, so it is considered a conscious decision here.
Your only way to interact with this would be through a UI extension, but it would be interesting to know a bit more about the use case to see if it actually makes sense to go down that route (a UI extension is nontrivial).

Can I avoid making a synchronous callback, if I want a click to only *sometimes* open a new window?

In this scenario:
User enters some information into a textbox
User clicks a button
Server-side processing of the entered information takes place
Depending on the result of that server-side processing, either a new window is to be opened, or a message is to be displayed on the current page (and no popup)
I cannot come up with an approach other than to use async: false in the jQuery ajax call, which is strongly discouraged:
Setting this option to false (and thus making the call no longer
asynchronous) is strongly discouraged, as it can cause the browser to
become unresponsive.
I've tried:
having the call be async and in the callback handler, depending on what the server said, sometimes opening a new window - this gets blocked by popup blockers
another idea, which I've not even bothered with due to its unpleasantness, is to always open a window, and it is this new window that calls the server, and sometimes closes itself (somehow updating text in the parent on its way out)
What I've settled on is what I've described above: in the click handler, do a synchronous server call, and if the server says to do so, open a new window. Popup blockers are happy with this, because the window opening is done in the click handler. But...
Similar (but not duplicate, as I don't always want to open a new window) questions that have not provided a nice solution:
How can I open a new window using a URL that is generated inside the getScript callback function, and avoid pop-up blockers?
(How) can I open the result of a form submission in a new window?
what you can do is ,
try to have a hidden field on your page which will be set by a value like true or false at server side , that you can check later on in jquery document .ready function
if the value is false just show a msg else popup a new window
as simple as that
I tried out my 'unpleasant' idea: to always open a new window, and have that new window make the server call, closing itself if the results of the server call dictated that it was not required.
But that was pretty horrible, so I stuck with the synchronous call.
So for me, the answer to this question is no, you can't avoid being synchronous in this situation.

as3 detect swf close event

how can i detect swf close event in ActionScript 3.
I need to perform some action while swf close event. is it possible?
If you want to stop the application from closing you need to listen for the closing and stop it (preventDefault).
If you want to perform some shutdown actions when the application is closed then you register your actions on the close event.
For AS3 , it would depend on how your application is closing.
If the user decided to close the browser window, you may have to look into Javascript for ways to intercept the event and prevent the window from closing. A little Googling should provide you with a few solutions, you'll only have to make sure it works with most browsers...
After you've managed that, you can call Actionscript within your JS function , using ExternalInterface, then return a call to JS from AS3, after you've done what you wanted , in order for the browser to close the window.
Now you still can give the user the choice to close the application directly from AS3 by implementing a "Close Application" button and informing the user it'd be kinda cool if she was using this button instead of simply closing the browser window, which then leads you to the situation where if she does, you won't need to call the JS function anymore, you may have to setup some Boolean so that functions don't get called twice!

How long has a user been on a asp.net page (custom analytics)?

I am trying to come up with a way to measure how long a user has been on a page in my ASP.NET application. I am storing the userid, pagename, pageenteredtime and pagelefttime in a database. Each record has its own unique id as well, called featureuselogid.
At the moment, I can track when a user comes into the page with the page_load function on the server side. I store the userid, pagename and pageenteredtime.
After that im stuck, and need some guidance in the right direction. I need to record the time the user leaves the page. I know in javascript there is a window.onbeforeunload function, which will cover most cases (browser shutdown, links etc).
But how do I pass the featureuselogid to the javascript? If i can do that, I think I can make a webservice call from the javascript and update the record with the pagelefttime.
Am I going down the wrong path?
Cheers in advance.
You will have to run Javascript timer on the client that periodically calls the server. Once the call does not get logged at the expected time, it means that the user has left. Woopra does this, and it works reliably. For instance, sometimes people have a page loaded in a browser in the background for days, and there is no other way of detecting that they are still connected.
Users on laptops pulling the network cable, moving out of the coverage of a Wifi zone, etc etc there are too many scenarios where the onbeforeunload event will not reach a server anymore.
Just put the featureuselogid in a hidden field in the page, with a unique ID that will make it accessible to Javascript, or set a javascript variable.
Having said that, I believe that you are going to be able to most reliably detect Page_Load. You can determine the time between pages by measuring the time between Page_Load events. You won't get the browser closure, but IMO knowing when the user closes the browser is not all that meaningful.
When you render the page in ASP.net, include a javascript tag that assigns a variable to the value of a server side script:
<script language="javascript">
var JS_featureuselogid = <%= featureuselogid %>;
</script>
Later in your javascript code, you can reference the JS_featureuselogid variable and get the value that was injected into it during page construction.

Prevent a user from closing a browser window using "X"?

Can I tell, using javascript, whether a user has clicked on the "X" icon on a browser dialog, or the "OK"/"Cancel" buttons? I have code I need to run when the window closes, but it will only run when OK or Cancel are clicked.
I currently capture the onunload event of the window. How can i accomplish this?
window.onunload = function() { alert("unloading"); }
Why do you want to do this? We can probably help you come up with a different design that doesn't require this if you tell us what you're trying to do.
However, to answer your question: it's not possible to catch that event in all cases. You cannot prevent the user from closing the browser or guarantee that your code will execute when they do. You can make it slightly annoying for them, but they can disable javascript, or kill the process, or reboot the computer. Using the unload function is the closest you can come to having some code that runs when the window closes (it will run in cases of normal shutdown or when the user navigates away).
If I understood correctly, your question is about a browser dialog, not the main browser window.
To answer your question, you probably cannot distinguish between the Cancel button and the X button of a browser dialog. They'll both end up just returning a false. If you need this level of control, you should consider writing your own simulated dialog (lightbox) instead of a real JavaScript dialog. Or perhaps look at existing frameworks/plugins with modal dialogs that give you the amount of control you need.
What about if he does ALT + F4?
To the best of my knowledge, you can't detect whether the user closed the dialog by clicking the Cancel button or the [x] button, since neither are exposed to you beyond returning the result of the action (e.g., confirm() as true/false).
You can hook into the document.onbeforeunload event to perform whatever cleanup action you require; I've done so myself by sending an asynchronous XMLHTTP request to the server to make sure the user's session gets cleaned up properly.
It is impossible to catch the closing of the browser and handle every other event that also causes a post back. You can try and many people have before you and failed.
Your best bet is to use onbeforeunload and learn how to deal with session timeouts on your serverside to clean up data.

Resources