docs.rodeo

MDN Web Docs mirror

Window: beforeunload event

{{APIRef}} 

The beforeunload event is fired when the current window, contained document, and associated resources are about to be unloaded. The document is still visible and the event is still cancelable at this point.

The main use case for this event is to trigger a browser-generated confirmation dialog that asks users to confirm if they really want to leave the page when they try to close or reload it, or navigate somewhere else. This is intended to help prevent loss of unsaved data.

The dialog can be triggered in the following ways:

The last two mechanisms are legacy features; best practice is to trigger the dialog by invoking preventDefault() on the event object, while also setting returnValue to support legacy cases.

Syntax

Use the event name in methods like {{domxref("EventTarget.addEventListener", "addEventListener()")}} , or set an event handler property.

addEventListener("beforeunload", (event) => {});
onbeforeunload = (event) => {};

Event type

A {{domxref("BeforeUnloadEvent")}} . Inherits from {{domxref("Event")}} .

Usage notes

To trigger the dialog being shown when the user closes or navigates the tab, a beforeunload event handler function should call {{domxref("Event.preventDefault()", "preventDefault()")}}  on the event object. You should note that modern implementations:

The beforeunload event suffers from some problems:

It is therefore recommended that developers listen for beforeunload only when users have unsaved changes so that the dialog mentioned above can be used to warn them about impending data loss, and remove the listener again when it is not needed. Listening for beforeunload sparingly can minimize the effect on performance.

Event handler aliases

In addition to the Window interface, the event handler property onbeforeunload is also available on the following targets:

Examples

In the following example we have an HTML text {{htmlelement("input")}}  to represent some data that could be changed and require saving:

<form>
  <input type="text" name="name" id="name" />
</form>

Our JavaScript attaches an {{domxref("Element/input_event", "input")}}  event listener to the <input> element that listens for changes in the inputted value. When the value is updated to a non-empty value, a beforeunload event listener is attached to the {{domxref("Window")}}  object.

If the value becomes an empty string again (i.e. the value is deleted), the beforeunload event listener is removed again — as mentioned above in the Usage notes, the listener should be removed when there is no unsaved data to warn about.

The beforeunload event handler function invokes event.preventDefault() to trigger the warning dialog when the user closes or navigates the tab. We have also included event.returnValue = true in the handler function so that any browsers that don’t support the event.preventDefault() mechanism will still run the demo correctly.

const beforeUnloadHandler = (event) => {
  // Recommended
  event.preventDefault();

  // Included for legacy support, e.g. Chrome/Edge < 119
  event.returnValue = true;
};

const nameInput = document.querySelector("#name");

nameInput.addEventListener("input", (event) => {
  if (event.target.value !== "") {
    window.addEventListener("beforeunload", beforeUnloadHandler);
  } else {
    window.removeEventListener("beforeunload", beforeUnloadHandler);
  }
});

When the <input> value is non-empty, if you try to close, navigate, or reload the page the browser displays the warning dialog. Try it out:

{{EmbedLiveSample("Examples", "100%", 50)}} 

Specifications

{{Specifications}} 

Browser compatibility

{{Compat}} 

See also

In this article

View on MDN