浏览器窗口意外关闭时发出警报
Posted
技术标签:
【中文标题】浏览器窗口意外关闭时发出警报【英文标题】:Alert when browser window closed accidentally 【发布时间】:2010-11-17 16:32:16 【问题描述】:我有一个聊天应用程序,我希望每当用户意外或手动关闭浏览器时,他应该得到一个警报,以便可以执行各种清理操作。我在事件之前尝试使用更多东西,但我希望将其用于特定网页,因为在加载之前也会调用所有其他网页。请帮忙
【问题讨论】:
【参考方案1】:我们应该防止或提示用户在执行这些操作时会丢失他的数据。
-
点击后退浏览器按钮。
点击刷新浏览器按钮。
点击浏览器的关闭按钮。
点击前进浏览器按钮。
键盘敲击- Alt+F4(关闭)
键盘敲击- F5(刷新)
键盘敲击-CTRL+ F5(刷新)
键盘敲击-Shift+ F5(刷新)
网址变更
或任何导致回发的东西,而不是您的特定提交按钮。
为了说明我使用了两个文本框,一个带有 ID TestButton 的 Asp.net 提交按钮。 我采取的其他回发控制是 另一个 asp.net 按钮,一个带有 autopostback 属性 true 的复选框,一个带有 autopostback 属性 true 的下拉列表。 现在我已经使用了所有这些回发控件,以便向您展示当用户对这些控件执行操作时,我们还需要向用户显示有关数据丢失的提示。 在提交按钮上,我们将不会显示提示,因为我们必须使用该控件操作提交数据。这里是示例代码。我已经在控件更改时设置了 window.onbeforeunload 方法。
<html >
<head id="Head1">
<title></title>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$(function()
// Prevent accidental navigation away
$(':input').bind(
'change', function() setConfirmUnload(true); );
$('.noprompt-required').click(
function() setConfirmUnload(false); );
function setConfirmUnload(on)
window.onbeforeunload = on ? unloadMessage : null;
function unloadMessage()
return ('You have entered new data on this page. ' +
'If you navigate away from this page without ' +
'first saving your data, the changes will be lost.');
window.onerror = UnspecifiedErrorHandler;
function UnspecifiedErrorHandler()
return true;
);
</script>
</head>
<body>
<form id="form1" name="myForm" runat="server">
<div>
First Name :<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
<br />
Last Name :<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
<br />
IsMarried :<asp:CheckBox ID="CheckBox1" runat="server" /><br />
<br />
<asp:Button runat="server" ID="TestButton" Text="Submit" CssClass="noprompt-required" /><br />
<br />
<br />
<br />
<br />
<asp:Button runat="server" ID="AnotherPostbackButton" Text="AnotherPostbackButton"
/><br />
<br />
<asp:CheckBox runat="server" ID="CheckboxWhichCausePostback" Text="CheckboxWhichCausePostback"
AutoPostBack="true" /><br />
<br />
DropdownWhichCausePostback<asp:DropDownList runat="server" ID="DropdownWhichCausePostback"
AutoPostBack="true">
<asp:ListItem Text="Text1"></asp:ListItem>
<asp:ListItem Text="Text2"></asp:ListItem>
</asp:DropDownList>
<br />
<br />
</div>
</form>
</body>
以上我用过:
$('.noprompt-required').click(function() setConfirmUnload(false); );
我在这一行中所做的是我正在调用 setConfirmUnload
方法并将 false 作为参数传递,这会将 window.onbeforeunload
设置为 null。
因此,这意味着在您希望不提示该用户的任何控件上,将该控件授予 .noprompt-required
类并保留其他控件。
【讨论】:
我投了这个票,但是......它在ios(iPad/iPhone)中不起作用,这很糟糕。 即使在实际提交表单时也会触发此解决方案。无法使用。 它不起作用。我尝试关闭浏览器的关闭按钮 不起作用;该消息将是 Firefox 和 chrome 中的标准消息。它不能设置,所以省去多余的绒毛,你只需要一个非常简单的 onbeforeunload 事件处理程序位来返回一些东西。【参考方案2】:这不是一个真正的 JQuery 东西,我使用这个函数:
function setConfirmUnload(on)
window.onbeforeunload = (on) ? unloadMessage : null;
function unloadMessage()
return "Are you sure you want to leave this page";
然后,你可以随时调用
setConfirmUnload(true) 启用确认,如果你想让他们在没有警告的情况下关闭屏幕(例如,如果你有一个关闭按钮),则为 false。
【讨论】:
【参考方案3】:你可以试试卸载事件:
$(window).unload( function () alert("Bye now!"); );
http://docs.jquery.com/Events/unload
我猜这个清理只在客户端。了解这些“清理”的性质会很有趣。
【讨论】:
“了解自然很有趣”。它们最好不是主机需要的东西,因为无论您可以在卸载时强制执行哪种清理,如果浏览器从任务管理器中被杀死或用户的 PC 崩溃,您将无法捕获它... 我还暗示可能还需要在服务器上进行一些清理。如果任务管理器中的浏览器终止,则可能会处理一些事情。 这会提醒用户,但他们无法返回页面。我认为他问题中的“意外”一词暗示了 SO 使用的一种警报。【参考方案4】:你可以用ajax试试这个
$(window).unload( function () alert("AJAX function to do required job"); );
【讨论】:
以上是关于浏览器窗口意外关闭时发出警报的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中的窗口窗体应用程序中关闭窗口时发出警报 [重复]