Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting a cancel in navigation with Javascript or jQuery

I was curious if there was a way to detect the user pressing the "stop navigation" button in the browser using javascript (or, even better, jQuery.) For example, if you click a link for a webpage that takes a while to load, you may want to show a spinning loader. But what if the user cancels navigation to the page? Is there anyway to detect that to get rid of the spinning loader that you put?

EDIT: I did a bit more research, and there seems to be an onStop event in javascript but, wouldn't you know it, it only works in internet explorer. If anyone has any other ideas to implement a cross browser solution like onStop, that'd be wonderful, but if not, I'll answer my own question in a few days to close this.

EDIT 2: https://stackoverflow.com/a/16216193 says it's not possible. As do a few other answers.

like image 204
Osmium USA Avatar asked Jul 22 '13 17:07

Osmium USA


1 Answers

Alright so, as promised, I'm going to answer my own question.

I've thought about this quite a bit - and I've come up with a solution. I wasn't able to make it work in code (I didn't try too hard), but it should work in theory.

So I thought about the criteria of deciding when a webpage should decide stop was called. I came up with this:

  • If the script hasn't died after a reasonable amount of time, it can be assumed navigation has been canceled.

Then a jQuery event can be fired on the body or something like that. But what constitutes "a resonable amount of time?" I figured it would be partially based on page render time (fetching images, etc.) to get an idea of how fast the user's internet is. That can be gotten by doing:

var start = new Date();
var time;
$("body").load(function () {
    time = new Date() - start;
    ...
});

Multiply that by a coefficient (maybe 3 or something) and get an approxamate transfer time. (This would have to be adjusted to account for how long it would take for the server to generate the next page, dependent on how dynamic it is.) Then, using this new found time*3 you'd write something like this:

$("a").click(function() { //Anything that could go to another page should filter through here
    setInterval(function() {$(document).trigger("navstopped");},time*3);
}
$(document).on("navstopped") {
    //Do stuff now that we assume navigation stopped.
}

Assume. That's really all we're doing here. We may have an inconsistent internet connection, fast one minute, slow the next. Server load could be inconsistent too. Maybe it's serving up images like a ninja for this page, but it's hit with a bunch of requests the next, making it generate/serve the next page a bit slower. So we're just assuming that something interrupted the navigation some how, but we are not certain.

Now, of course, this could be used in conjunction with IE's onStop event, but this was really the only cross browser solution I could think of. I wasn't able to get it to work, but maybe some jQuery god may be able to in the future.

Edit before post: Even before I posted this, I had another idea. More browsers support onAbort. If we have a picture that never loads, and the user presses stop, will onAbort be fired? Even if another webpage is loading? It requires testing but that may work too. I like my first idea better though. Although unstable, it is more stable than this cockamamie idea and I realize this could be bad practice.

like image 142
Osmium USA Avatar answered Nov 03 '22 12:11

Osmium USA