views:

107

answers:

1

Dear Stackers,

I'm developing a web application which requires long-running Ajax requests. Unfortunately, under Firefox, pressing Escape during a request has the drawback of killing the request and any information it was holding. This is rather annoying, as this can lead to all sorts of nasty complications if this happens at the wrong time. Therefore, I would like to deactivate this feature.

My first reflex was to intercept keypresses at the boundaries of <body>, to ensure that they would not reach the window. For this purpose, I installed a [keypress] event handler, just for events whose [keyChar] is 27, and had it invoke [stopPropagation] and [preventDefault]. And for a time, it looked like this was working.

Then, I realized that it wouldn't work when the user hadn't clicked anywhere on the window, as <body> event handlers never received the event. I tried to attach my handler to <document> or <window> to no avail, so I eventually ended up adding a [load] event handler and had it force focus to <body>. And for a time, it looked like this was working.

Then, I realized that when the user was editing an <input>, for some reason, once again, the <body>, <document> or <window> event handler never seem to receive the event. So, I added yet another [keypress] handler, intercepting with [preventDefault] on the <input> when the [keyChar] is 27.

For the moment, it looks like it's working. However, with the history of this bug in my application, I'm a tad pessimistic.

So, I'm wondering if there's a better -- and reproducible -- method. Recall that the bug seems to appear only in FF, so I'm quite willing to take a FF-only approach here.

Thanks

+2  A: 

I'd be worried about other nasty complications that will happen when the users choose a bookmark or otherwise navigate away in the middle of the request. You might want to look at why you're using long running requests and see if that's something you can change...

If it isn't something you can change (or even if you can) you should look at why your requests aren't fault tolerant. Is there a way to put the communication into transactions, and roll the latest one back if the connection is interrupted?

Kendrick
BOSH and Comet are good examples that require long-running ajax requests.
Kirk Woll
Hadn't heard of them, but looking at BOSH, the protocol is supposed to be fault tolerant and be cabable of being split over multiple requests: http://xmpp.org/extensions/xep-0124.html#reqs
Kendrick
No, there's strictly no way we can get around long-running requests. We need to be able to push results from the server to the browser immediately -- and we can't afford to be compatible only with HTML5 browsers and WebSockets.But don't worry about the other nasty complications you mention, we have them handled.
Yoric
How about asking the users (nicely) not to press Esc :-) I don't know the app, but it seems that as long as ending a request isn't going to cause data integrity problems on the server side, capturing the key events is probably sufficient in this case.
Kendrick
@Kendric :) Thank heavens, the server won't have data integrity problems. But `Esc` could possibly set the client is an inconsistent state, which is generally unacceptable. After all my patches, I can't reproduce the issue, so I'll cautiously mark it as "possibly solved". And hope that, if it isn't actually solved, users won't just start pressing `Esc`.
Yoric