我需要在用户离开页面之前警告他们未保存的更改(这是一个非常常见的问题).

window.onbeforeunload = handler

这是可行的,但它会弹出一个默认对话框,其中包含一条令人讨厌的标准消息,其中包含我自己的文本.我需要完全替换标准消息,使我的文本清晰,或者(更好的)使用jQuery使用模式对话框替换整个对话框.

到目前为止,我失败了,我还没有找到其他似乎有答案的人.这有可能吗?

我的页面中的Javascript:

<script type="text/javascript">   
    window.onbeforeunload = closeIt;
</script>

函数的作用是:

function closeIt()
{
  if (changes == "true" || files == "true")
  {
      return "Here you can append a custom message to the default dialog.";
  }
}

使用jQuery和jqModal,我try 了这种方式(使用自定义确认对话框):

$(window).beforeunload(function () {
    confirm('new message: ' + this.href + ' !', this.href);
    return false;
});

这也不起作用——我似乎无法参加beforeunload项赛事.

推荐答案

您无法将默认对话修改为onbeforeunload,因此最好使用它.

window.onbeforeunload = function() {
    return 'You have unsaved changes!';
}

Here's a reference从微软获得:

将字符串分配给window.event的rereturn Value属性时,将出现一个对话框,用户可以 Select 停留在当前页并保留分配给它的字符串.对话框中显示的默认语句"是否确实要离开此页?.按"确定"继续,或按"取消"停留在当前页."不能删除或更改.

问题似乎是:

  1. 调用onbeforeunload时,处理程序的返回值为window.event.returnValue.
  2. 然后,它会将返回值解析为字符串(除非返回值为空).
  3. 由于false被解析为字符串,因此对话框将被触发,然后将传递适当的true/false.

结果是,似乎没有一种方法可以将false指定给onbeforeunload,以防止它成为默认对话.

关于jQuery的补充说明:

  • 在jQuery may中设置事件可能会有问题,因为这也会导致其他onbeforeunload个事件发生.如果你只希望卸载事件发生,我会坚持使用普通的ol'JavaScript.
  • jQuery没有onbeforeunload的快捷方式,所以您必须使用通用的bind语法.

    $(window).bind('beforeunload', function() {} );
    

Edit 09/04/2018:onbeforeunload对话框中的自定义消息自chrome-51(cf:release note)以来已被弃用

Javascript相关问答推荐

JavaScript寻求、寻求和时间更新事件||Mux

判断现代浏览器中的点击是否由touch 触发

我无法使用tailwind-css和reactJS修改图像的位置

d3可排序表标题行中有收件箱--如何使收件箱不触发排序?

在shiny 模块中实现JavaScript

调用SEARCH函数后,程序不会结束

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

为什么!逗号和空格不会作为输出返回,如果它在参数上?

如何调用名称在字符串中的实例方法?

VUE 3捕获错误并呈现另一个组件

如何迭代叔父元素的子HTML元素

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

在数组中查找重叠对象并仅返回那些重叠对象

Phaserjs-创建带有层纹理的精灵层以自定义外观

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

将多个文本框中的输出合并到一个文本框中

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

与在编剧中具有动态价值的定位器交互