是否可以在 beforeunload 弹出窗口中显示自定义消息?

IT技术 javascript jquery google-chrome firefox safari
2021-01-28 22:09:34

使用window.onbeforeunload(或$(window).on("beforeonload")) 时,是否可以在该弹出窗口中显示自定义消息?

也许是一个适用于主要浏览器的小技巧?

通过查看现有答案,我感觉过去可以使用confirmoralert或 or 之类的东西event.returnValue,但现在似乎它们不再起作用了。

那么,如何在 beforeunload 弹出窗口中显示自定义消息?这甚至/仍然可能吗?

6个回答

tl;dr - 在大多数现代浏览器中您不能再设置自定义消息

快速说明(因为这是一个旧答案) - 现在所有主要浏览器都不支持beforeunload弹出窗口中的自定义消息没有新的方法可以做到这一点。如果您仍然需要支持旧浏览器 - 您可以在下面找到信息。

为了在用户关闭窗口之前设置确认消息,您可以使用

jQuery

$(window).bind("beforeunload",function(event) {
    return "You have some unsaved changes";
});

Javascript

window.onbeforeunload = function() {
    return "Leaving this page will reset the wizard";
};

      它注意到你很重要不能 confirm/alert 里面 beforeunload


还有一些注意事项:

  1. 并非所有浏览器都支持此功能(更多信息请参见MDN 上浏览器兼容性部分) 2. 在 Firefox 中,您必须与页面进行一些真正的交互,以便向用户显示此消息。
    3. 每个浏览器都可以在您的消息中添加自己的文本。

以下是使用我有权访问的浏览器的结果:

铬合金:

退出时的 Chrome 警报

火狐:

Firefox 退出时发出警报

苹果浏览器:

退出时萨法尔警报

IE:

退出时的 IE 警报

只是为了确保 - 您需要包含 jquery

有关浏览器支持和删除自定义消息的更多信息:

  1. Chrome在 ver 51 中删除了对自定义消息的支持
  2. Opera在 ver 38 中删除了对自定义消息的支持
  3. Firefox 在 44.0 版中删除了对自定义消息的支持(仍在寻找此信息的来源)
  4. Safari在 9.1 版中删除了对自定义消息的支持
并非所有浏览器都支持这一点——实际上哪些浏览器支持它?
2021-03-10 22:09:34
我在Chrome测试,它工作。它并没有显示你有一些未保存的更改,但另一条消息。我的问题特别是关于是否可以显示自定义消息。我不在乎它是否也显示默认内容。我只是想让我们传入的文本显示在某处。
2021-03-17 22:09:34
确切地。这就是我想指出的:是否有针对最新版本的 Chrome 和 Firefox 的修复程序?
2021-03-24 22:09:34
Chrome、Safari、火狐、IE
2021-04-03 22:09:34
应更新此答案,以更清楚地说明其中大部分内容已过时。
2021-04-08 22:09:34

使用window.onbeforeunload(或$(window).on("beforeonload")) 时,是否可以在该弹出窗口中显示自定义消息?

不再。所有主要浏览器都开始忽略实际消息而只显示自己的消息。

通过查看现有答案,我感觉过去可以使用confirmoralert或 or 之类的东西event.returnValue,但现在似乎它们不再起作用了。

正确的。一个很长的时间以前,你可以使用confirmalert更近,你可以从一个返回一个字符串onbeforeunload处理函数和字符串将被显示。现在,字符串的内容被忽略,它被视为一个标志。

使用 jQuery 时on,您确实必须returnValue在原始事件上使用:

$(window).on("beforeunload", function(e) {
    // Your message won't get displayed by modern browsers; the browser's built-in
    // one will be instead. But for older browsers, best to include an actual
    // message instead of just "x" or similar.
    return e.originalEvent.returnValue = "Your message here";
});

或老式的方式:

window.onbeforeunload = function() {
    return "Your message here"; // Probably won't be shown, see note above
};

这就是你所能做的。

我刚刚做了一个 div 出现,在后台显示一条消息。它在模态后面,但这总比没有好。这有点阴暗,但至少你可以给你的用户一些关于你为什么打扰她/他不要离开的信息。

constructor($elem)
{
    $(window).unbind().bind('beforeunload', (e) => this.beforeUnload(e));
}
beforeUnload(e)
{
    $('#leaveWarning').show();
    setTimeout(function(){
        $('#leaveWarning').hide();
    }, 1); // set this to 1ms .. since timers are stopped for this modal,
           // the message will disappear right after the user clicked one of the options  
    return "This message is not relevant in most modern browsers.";
}

这是一个工作小提琴https://jsfiddle.net/sy3fda05/2/

你是对的..但实际上点是“onbeforeunload”默认弹出窗口出现......我可以禁用它吗?..我不想显示这个警报..
2021-03-16 22:09:34
小提琴好看!不幸的是(截至 2020 年 5 月)这仅适用于 Firefox,而不适用于 Chrome,所以我认为我们可能会不走运。
2021-03-24 22:09:34
安迪,你介意分享一个演示链接吗?
2021-03-28 22:09:34
当然。这是一个使用普通/jquery JS 的小提琴Fiddle
2021-03-29 22:09:34
谢谢安迪。很想在各种操作系统/浏览器上进行测试。
2021-04-06 22:09:34

自 2021 年起,出于安全原因,不再可能在beforeunload弹出窗口中显示自定义消息,至少在主要浏览器(Chrome、Firefox、Safari、Edge、Opera)中是如此。

这不再可能,因为:

  • 铬:版本 51
  • 火狐:版本 44
  • Safari:版本 9
  • Edge:从未有过
  • 歌剧:版本 38

详情请见:

获得类似结果的另一种方法是捕获与链接相关的点击事件(这会使您离开当前页面)并在那里请求确认。可能会调整它以包含表单提交或通过脚本重定向(这将需要在触发重定向的元素中应用特定的类和信息)。

这是一个工作代码片段(基于 jQuery),它向您展示了如何做到这一点:

编辑:出于安全原因,SO 中的代码段不适用于所有浏览器(该代码段生成 iframe ......并且在某些浏览器中“在不同的原始域 iframe 中不允许使用 window.confirm”),但是代码确实有效,所以试一试吧!

$('body').on('click', function(e) {
  var target, href;
  //Identifying target object
  target = $(e.target);

  //If the target object is a link or is contained in a link we show the confirmation message
  if (e.target.tagName === 'A' || target.parents('a').length > 0) {
    //Default behavior is prevented (the link doesn't work)
    e.preventDefault();

    if (window.confirm("Are you really really sure you want to continue?")) {

      //Identify link target
      if (e.target.tagName === 'A') {
        href = target.attr('href');
      } else {
        href = target.parents('a').first().attr('href');
      }

      //Redirect
      window.location.href = href;

    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<a href="https://stackoverflow.com">Click me and I'll take you home</a>

这似乎只有在用户点击 <a> 时才有效。如果用户通过 Ctrl + R 强制刷新怎么办?这个答案太有限,不能依赖
2021-03-13 22:09:34
@KarueBensonKarue 我刚刚提出了一种不同的方法。如果你需要被360°覆盖,你仍然可以使用我提出的结合beforeunload事件,在点击链接时有一个定制的消息。
2021-03-21 22:09:34

您无法在现代浏览器上设置自定义消息,而可以使用默认警报功能。

结帐浏览器兼容性