最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - onbeforeunload not working inside react component - Stack Overflow

programmeradmin4浏览0评论

I have a simple react-component where a user can edit data. As the values that may be changed could take some time I want to ask the user to confirm when leaving the page in case of unsaved changes.

In the component's constructor I call:

window.addEventListener("beforeunload", this.handleWindowBeforeUnload);

I also tried

window.onbeforeunload = this.handleWindowBeforeUnload;

The handleWindowBeforeUnload looks like this:

private handleWindowBeforeUnload = (ev: BeforeUnloadEvent): string => {
    return "Unsaved changes. Are you sure?";
}

However, setting a breakpoint will hit. But nevertheless there is no prompt showing that leaving may be dangerous. Also tried with latest Firefox but nothing happened. As stated on MDN I also tried

// Cancel the event as stated by the standard.
e.preventDefault();

// Chrome requires returnValue to be set.
e.returnValue = '';

// return something to trigger a dialog
return null; // ''; // "Do something"

Still nothing happens. What am I doing wrong here?

I have a simple react-component where a user can edit data. As the values that may be changed could take some time I want to ask the user to confirm when leaving the page in case of unsaved changes.

In the component's constructor I call:

window.addEventListener("beforeunload", this.handleWindowBeforeUnload);

I also tried

window.onbeforeunload = this.handleWindowBeforeUnload;

The handleWindowBeforeUnload looks like this:

private handleWindowBeforeUnload = (ev: BeforeUnloadEvent): string => {
    return "Unsaved changes. Are you sure?";
}

However, setting a breakpoint will hit. But nevertheless there is no prompt showing that leaving may be dangerous. Also tried with latest Firefox but nothing happened. As stated on MDN I also tried

// Cancel the event as stated by the standard.
e.preventDefault();

// Chrome requires returnValue to be set.
e.returnValue = '';

// return something to trigger a dialog
return null; // ''; // "Do something"

Still nothing happens. What am I doing wrong here?

Share Improve this question edited Sep 21, 2018 at 18:09 KingKerosin asked Sep 21, 2018 at 17:58 KingKerosinKingKerosin 3,8415 gold badges43 silver badges86 bronze badges 4
  • This might be a no-brainer dummy question and I'm sorry to ask but just to be sure: did you set the returnValue/prevent default before the return line? (eg you don't early-return before it actually happens) – Rose Robertson Commented Sep 21, 2018 at 18:04
  • 1 I tried returning null, '' as well as a string Do something at the very end of the function - Nothing happened. I know that custom strings or alerts will not be shown/are not supported. But at least the dialog (as written everywhere) would be great to see... – KingKerosin Commented Sep 21, 2018 at 18:07
  • So I wonder if you bind on mount instead it will work. But as to why that would work when it doesn't in the constructor I'm not sure! – Rose Robertson Commented Sep 21, 2018 at 18:10
  • Ah someone just answered with that as well :) – Rose Robertson Commented Sep 21, 2018 at 18:11
Add a comment  | 

2 Answers 2

Reset to default 11

You'll need to call the method inside the lifecycle methods:

componentDidMount() {
  window.addEventListener("beforeunload", this.handleWindowBeforeUnload);
}

componentWillUnmount() {
  window.removeEventListener("beforeunload", this.handleWindowBeforeUnload);
}

Modern React Solution

useEffect(() => {
  const preventUnload = (event: BeforeUnloadEvent) => {
    // NOTE: This message isn't used in modern browsers, but is required
    const message = 'Sure you want to leave?';
    event.preventDefault();
    event.returnValue = message;
  };

  window.addEventListener('beforeunload', preventUnload);

  return () => {
    window.removeEventListener('beforeunload', preventUnload);
  };
}, []);

You may also need this depending on your lint config:

// eslint-disable-next-line no-param-reassign
event.returnValue = message;
发布评论

评论列表(0)

  1. 暂无评论