• 0

[JavaScript] onbeforeunload with exception


Question

I am working on a site that places orders and mgmt wants an alert when the user attempts to leave the site so that they don't lose their order. So of course the base answer is to use the "onbeforeunload" function. This is fine, except that there are "a href" tags that call JavaScript functions on the page (no way around this) So what I'm attempting to do is to find a way around. I have a variable (mbBeforeUnload) that is set when an item has been added to the order. But other than that I have not been able to find a way around this issue.

Code:

window.onbeforeunload = checkBeforeUnload;

function checkBeforeUnload(){

if (mbBeforeUnload){

return "The order will be lost if you navigate away from this page.";

}

}

Any thoughts?

10 answers to this question

Recommended Posts

  • 0

you are defining checkBeforeUnload after calling it...

chk out this example:

<HTML>
<head>
<script>
function closeIt()
{
  return "Any string value here forces a dialog box to \n" + 
		 "appear before closing the window.";
}
window.onbeforeunload = closeIt;
</script>
</head>
<body>
  <a href="http://www.microsoft.com">Click to navigate to 
	  www.microsoft.com</a>;
&lt;/body&gt;
&lt;/html&gt;

  • 0

Thanks, but that's not it at all. The function works as it should, I would like to be able to avoid triggering the call in specific cases. The "onbeforeunload" function is called for any <a> link and I have a few links that are just JavaScript calls.

The code below is simply lines taken out of context to show everyone what is being done. The variable "mbBeforeUnload" is set to true when any item is added to the order. So when the user selects a link after an item has been added the variable is true and the call is made. I have tried to temporarily reset the variable in the called function such as:

function test():{

mbBeforeUnload=false;

//do some other code

mbBeforeUnload=true;

}

But this still causes onbeforeunload to fire.

Thanks kindly nihal for the input. Any other ideas? Anyone?

  • 0

Yes I am calling a function using the "onclick"

Code:

<a href="java script:void(0)" onclick="ShowReviewSubmit();">3. Review & Submit</a>

So by this time the user has added one or more items and they want to review before accepting the order. All that does is hide and show some divs.

Thanks again for the feedback. If you're ever in the VB world and need help, feel free to ask. I've used that for 16 years, but JavaScript is new to me.

  • 0

Try this:

&lt;html&gt;
&lt;head&gt;
&lt;script&gt;
var preventPrompt = false;

function closeIt() {
  if(needsPrompt) {
	return "You sure?";
  }
  preventPrompt = false;
}
window.onbeforeunload = closeIt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;a href="http://www.google.com" onclick="preventPrompt=true;"&gt;A link that will be allowed regardless.&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;

We're using the onclick event to set a variable. This variable is checked in the closeIt() method to see whether we should allow the request to go through unhindered. Regardless of the outcome, we then set this variable to false again, so other browser actions will be intercepted.

  • 0

Rob,

Thanks but I'm using the onclick to run a javascript function. There is no real href.

&lt;a href="java script:void(0)" onclick="ShowReviewSubmit();"&gt;3. Review &amp; Submit&lt;/a&gt;

The first post mentions that I already use a variable "mbBeforeUnload" so that the unload only activates if the user has added items to the order. But unfortunatly the "window.onbeforeunload" function is activated on any a href, even if there is no url. (arg) I have tried resetting the variable in the called function such as:

function test():{
mbBeforeUnload=false;
//do some other code
mbBeforeUnload=true;
}

But that doesn't work. (double arg) So again, thanks kindly, but I need a diff answer.

Have a great long weekend (if you're here in the US, if not, well, ditch work/school, have some fun!)

  • 0

&lt;html&gt;
&lt;head&gt;
&lt;script&gt;
var preventPrompt = false;
var careAboutPrompting = true;

function closeIt() {
  if(!preventPrompt &amp;&amp; careAboutPrompting) {
	return "You sure?";
  }
  preventPrompt = false;
}

function specialEvent() {
  alert("Our special event has been called, without triggering the closeIt() method.");
  return false;
}

window.onbeforeunload = closeIt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;a href="#" onclick="preventPrompt=true;specialEvent();"&gt;Do something special.&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;

This really seems to do what you're asking unless I'm really mistaken. The careAboutPrompting variable in this example is basically akin to your mbBeforeUnload variable, set to true when you actually give a damn about the user possibly navigating away. The 'Do Something Special' link calls a JavaScript event, but the beforeunload event isn't acted upon.

Edited by Rob
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I can't believe it was only two years since the last time MS raised their prices and now they think they can do it again so soon. Of course they needed to backtrack on this. I hope Nintendo is next.
    • I guess I gotta be even more specific then since I'm looking for an absolute confirmation.  The mini PC has never booted up or powered on by me. I'm assuming it'll be like buying a new PC from a store. Nothing is set up. Like absolutely nothing on the mini PC because I can't emphasize this enough. My USB drive already has Windows set up on it from my other desktop so I know it's clean. So now I connect it to the mini PC before it's even booted up or go to the desktop. I then turn on the mini PC and boot into the USB drive. I should see an existing partition. I'll delete it and then install Windows again over the entire drive. I don't necessarily want to create a separate partition. Once it installs and boots to the desktop, I'm assuming the drive is "clean" and free of any malware/viruses. Basically, this process will eliminate any potential for malware/viruses to still somehow hide in the SSD and then potentially affect me later.  I'm being very anal about this because I really don't trust anything bought from AliExpress, but the price was very tempting.  Is Windows Defender reliable? Afterwards, if I do a full scan and it doesn't find anything in the SSD and the USB drive, can I be confident the mini PC is now safe and secured to enter my banking credentials? If not, what else can I do to be absolutely certain?
    • I got an ESR Qi2 vent charger for my car and it's fantastic. It's very strong magnet and holds the phone securely over the worst potholes/roads, and my iPhone does charge. In Summer, the AC blows on the vent keeps and keeps the phone cold. In winter, I just close that vent, so it still stays cold. I agree with you on the Android front. Why not just build in the magnets like Apple does? It's frustrating to buy a case that adds magnets.
    • Hey, I've been using Windows since I was a little tyke. But for the last 15 years, I have been using Linux. I'm using EndeavourOS/Arch atm. wipe it, as in deleting anything from the SSD in the computer. Make a new partition. USB booting device should be free of malware, as long as you download it directly friom MS. Not some XYZ company.
    • "Nuking it" is slang for doing a clean install. USB installation media... delete the partition... start fresh.
  • Recent Achievements

    • Collaborator
      fernan99 earned a badge
      Collaborator
    • Collaborator
      MikeK13 earned a badge
      Collaborator
    • One Month Later
      Alexander 001 earned a badge
      One Month Later
    • One Month Later
      Antonio Barboza earned a badge
      One Month Later
    • Week One Done
      Antonio Barboza earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      583
    2. 2
      ATLien_0
      216
    3. 3
      Michael Scrip
      171
    4. 4
      Xenon
      136
    5. 5
      +FloatingFatMan
      125
  • Tell a friend

    Love Neowin? Tell a friend!