为了账号安全,请及时绑定邮箱和手机立即绑定

如何在卸载之前重写该对话框并将其替换为我自己的对话框?

如何在卸载之前重写该对话框并将其替换为我自己的对话框?

跃然一笑 2019-06-01 13:36:01
如何在卸载之前重写该对话框并将其替换为我自己的对话框?在用户离开页面之前,我需要提醒他们注意未保存的更改(这是一个非常常见的问题)。window.onbeforeunload=handler这是可行的,但它会引发一个默认对话框,其中包含一个令人恼火的标准消息,该消息包装了我自己的文本我需要完全替换标准消息,这样我的文本就清晰了,或者(更好的)使用jQuery替换整个对话框。到目前为止,我已经失败了,我还没有找到其他似乎有答案的人。有可能吗?页面中的JavaScript:<script type="text/javascript">       window.onbeforeunload=closeIt;</script>clseit()函数:function closeIt(){   if (changes == "true" || files == "true")   {       return "Here you can append a custom message to the default dialog.";   }}使用jQuery和jqModal,我尝试了这种方法(使用自定义的确认对话框):$(window).beforeunload(function() {         confirm('new message: ' + this.href + ' !', this.href);         return false;     });这也不起作用-我似乎不能绑定到前卸载事件。
查看完整描述

4 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

不能修改默认对话onbeforeunload所以你最好的选择就是处理它。

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

这里有一个参考微软对此表示:

当将字符串分配给window.Event的返回值属性时,将出现一个对话框,该对话框允许用户在当前页上停留并保留分配给它的字符串。对话框中显示的默认语句“确实要从此页导航吗?.请按”确定“继续,或”取消“以保留当前页。”无法删除或更改。

问题似乎是:

  1. 什么时候

    onbeforeunload

    调用时,它将处理程序的返回值作为

    window.event.returnValue.

  2. 然后将返回值解析为字符串(除非为NULL)。
  3. false

    被解析为字符串时,对话框将触发,然后该对话框将传递一个适当的

    true/false.

结果是,似乎没有一种方法来分配falseonbeforeunload若要阻止它进行默认对话,请执行以下操作。

关于jQuery的附加说明:

  • 在jQuery中设置事件

    可以,可能

    是有问题的,因为这允许其他

    onbeforeunload

    事件也会发生。如果您只希望您的卸载事件发生,我将坚持使用普通的L‘JavaScript。
  • jQuery没有快捷方式onbeforeunload所以你得用通用的bind语法。

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

在卸载前对话框中的自定义消息被取消,因为chro-51(cf:释放说明)


查看完整回答
反对 回复 2019-06-01
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

什么对我有用,用jQuery在IE8、Chrome和Firefox中进行了测试,测试结果如下:

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

如果不需要提示,重要的是不要返回任何内容,因为IE和其他浏览器行为之间存在差异。


查看完整回答
反对 回复 2019-06-01
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

1)在卸载前使用onunload,而不是onunload。

2)重要的是避免执行返回语句。我不是说,这是为了避免从你的教练那里回来。您可以返回,但是您可以通过确保到达函数的末尾而不执行返回语句来完成这一任务。在这种情况下,内建标准对话框不会出现。

3)如果使用onpreunload,可以在卸载前处理程序中运行Ajax调用来清理服务器上的事务,但它必须是同步的,您必须在onpreunload处理程序中等待和处理答复(仍然遵守上面的条件(2)。我这么做,效果很好。如果您执行同步Ajax调用,那么所有的事情都会被推迟,直到响应返回。如果您执行异步操作,认为您不关心来自服务器的答复,那么页面卸载将继续进行,Ajax调用将被此进程中止-如果它正在运行,包括一个远程脚本。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 453 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信