这似乎是一个常见的问题,但搜索没有返回任何内容。
我有以下代码在页面卸载之前执行。问题是如果卸载是回发我不想向用户发出警告但我无法弄清楚如何区分回发和例如,用户导航到另一个页面。
// This is executed before the page actually unloads
$(window).bind("beforeunload", function () {
if (prompt) {
//prompt
return true;
}
else {
//reset our prompt variable
prompt = true;
}
})
在后面的代码中运行脚本,即如果Page.IsPostBack然后设置提示符不是一个选项。
有什么想法吗?
编辑:
以下是我最终解决的问题:
function DoNotPrompt() {
prompt = false;
}
然后我将此添加到用户可以执行某些操作的所有控件中。
OnClientClick="DoNotPrompt()
然后检查了这个标志,如果用户真的离开了页面而不是回发,那么只在“beforeunload”中返回一个字符串。
我还必须使用此代码: var magicInput = document.getElementById('__ EVENTTARGET');
if (magicInput && magicInput.value) {
// the page is being posted back by an ASP control
prompt = false;
}
原因是我有一个自定义用户控件是一个列表框,我无法添加上述方法。因此使用它来捕获该事件并将标志设置为false。
不是最优雅的解决方案。
谢谢, 迈克尔
答案 0 :(得分:2)
您可以捕获提交并将onbeforeunload重置为:
jQuery(function($) {
var form = $('form'), oldSubmit = form[0].onsubmit;
form[0].onsubmit = null;
$('form').submit(function() {
// reset the onbeforeunload
window.onbeforeunload = null;
// run what actually was on
if(oldSubmit)
oldSubmit.call(this);
});
});
这是我网页上经过测试的代码:)
答案 1 :(得分:1)
JavaScript在客户端上运行;就客户而言,页面不会保持从一个视图到下一个视图的状态。回发完全是一个ASP.NET概念。
您可以通过在服务器端运行一些代码来解决这个问题,该代码根据Page.IsPostBack
是否为真来定义JavaScript变量。
示例:
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Page.IsPostBack -> client</title>
<script type="text/javascript">
var isPostback = <%= Page.IsPostBack %>;
console.log("IsPostBack: " + isPostback);
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button runat="server" ID="btnTest" Text="Click me..." />
</div>
</form>
</body>
</html>
答案 2 :(得分:1)
这可能无法涵盖所有回发情况,但您可以通过询问__EVENTTARGET
隐藏输入来判断ASP控件是否回发了该页面。
当ASP控件回发页面时,此输入由ASP设置。
var magicInput = document.getElementById('__EVENTTARGET');
if (magicInput && magicInput.value) {
// the page is being posted back by an ASP control
}