Javascript 如果在ASP.NET中关闭窗口但不在回发时显示消息
我希望仅当用户关闭我的ASP.NET Web表单页面或离开该页面时,才向用户显示消息。如果他们单击任何按钮、LinkButton、AutoPostBack元素或任何其他将回发的内容,那么我不想显示该消息 到目前为止,我有以下代码:Javascript 如果在ASP.NET中关闭窗口但不在回发时显示消息,javascript,jquery,asp.net,Javascript,Jquery,Asp.net,我希望仅当用户关闭我的ASP.NET Web表单页面或离开该页面时,才向用户显示消息。如果他们单击任何按钮、LinkButton、AutoPostBack元素或任何其他将回发的内容,那么我不想显示该消息 到目前为止,我有以下代码: <script type="text/javascript"> var postback = false; addToPostBack = function(func) { var old__doPostBack = __doPostBack;
<script type="text/javascript">
var postback = false;
addToPostBack = function(func) {
var old__doPostBack = __doPostBack;
if (typeof __doPostBack != "function") {
__doPostBack = func;
} else {
__doPostBack = function(t, a) {
if (func(t, a)) old__doPostBack(t, a);
}
}
};
$(document).ready(function() {
addToPostBack(function(t,a) {
postback = true;
});
});
$(window).bind("beforeunload", function() {
if (!postback) {
return "message";
}
});
</script>
var postback=false;
addToPostBack=函数(func){
var old__doPostBack=_doPostBack;
if(类型为uu doPostBack!=“函数”){
__doPostBack=func;
}否则{
__doPostBack=函数(t,a){
if(func(t,a))old_uudopostback(t,a);
}
}
};
$(文档).ready(函数(){
addToPostBack(函数(t,a){
回发=真;
});
});
$(window.bind(“beforeunload”,function()){
如果(!回发){
返回“消息”;
}
});
这可以部分工作,但似乎可以阻止自动回发事件的触发,并且仍然显示链接按钮等的消息
我怎样才能做到这一点?试试这个:-
您可以通过使用以下代码来实现这一点:
<script type="text/javascript">
var isChanged = false;
$(document).ready(function () {
$('input').click(function () {
isChanged = true;
});
$('select').click(function () {
isChanged = true;
});
});
$(window).bind("beforeunload", function () {
if (isChanged) {
return '>>>>>Before You Go<<<<<<<< \n Your custom message go here';
}
})
</script>
这将使用调用uu doPostBack的时间戳,然后执行默认行为 onbeforeunload事件仅在其时间戳与最新的_doPostBack时间戳之间的差异大于allowedWaitTime时才会显示自定义消息 用法:将其包含在页面的任何位置 更新: 现在,它还将使用选项处理WebForm_doPostBack
(function ($) {
if (typeof $ !== 'function') {
throw new Error('jQuery required');
}
/* The time in milliseconds to allow between a __doPostBack call and
showing the onbeforeunload message. */
var allowedWaitTime = 100,
timeStamp = new Date().getTime(),
// Each function to override
baseFuncs = {
__doPostBack: this.__doPostBack,
WebForm_DoPostBackWithOptions: this.WebForm_DoPostBackWithOptions
};
// Set timeStamp when each baseFunc is called
for (var baseFunc in baseFuncs) {
(function (func) {
this[func] = function () {
var baseFunc = baseFuncs[func];
timeStamp = new Date().getTime();
if (typeof baseFunc === 'function') {
baseFunc.apply(arguments.callee, arguments);
}
}
})(baseFunc);
}
/* Form submit buttons don't call __doPostBack so we'll set timeStamp
manually on click. */
$('input[type="submit"]').click(function () {
timeStamp = new Date().getTime();
});
$(this).on('beforeunload', function (e) {
// Only return string if allowedWaitTime has elapsed
if (e.timeStamp - timeStamp > allowedWaitTime) {
return 'message';
}
});
}).call(window, jQuery);
在链接按钮和按钮上,设置
onclick=“$(窗口)。取消绑定(“beforeunload”);返回true;“
自动回邮元素应将onchange
或导致自动回邮设置为onchange=“$(窗口)。取消绑定(“beforeunload”);返回true;“
请确保在回发发生后再次绑定beforeunload 我无法让它工作(总是显示消息)。通过绑定到click,这难道不意味着即使您单击了屏幕的空白部分,它也会取消onbeforeunload事件吗?因此,如果您在浏览器中单击,它将使该单击的
onbeforeunload
为空,如果您尝试通过naivgate访问其他Url,它将显示消息。这似乎是最好的解决方案。非常感谢你。我将allowedWaitTime增加到100,因为我发现正常提交通常需要45毫秒。我还发现,对于称为WebForm_DoPostBackWithOptions而不是_doPostBack的按钮,这不起作用,因此,我复制了代码以覆盖WebForm的_doPostBack,并使用Options覆盖_doPostBack。我添加了对WebForm _DoPostBackWithOptions的支持,以便为这两种方法设置时间戳。我认为这不会处理链接按钮(呈现为标记),对吗?此外,如果您单击输入或选择“然后单击取消”中止离开页面,它将不会再次询问您。如果用户在警告框中按“取消”,则还必须重新绑定beforeunload。您可以在此处查看答案
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
var isChanged = false;
$(document).ready(function () {
$('input').click(function () {
isChanged = true;
});
$('select').click(function () {
isChanged = true;
});
});
$(window).bind("beforeunload", function () {
if (isChanged) {
return '>>>>>Before You Go<<<<<<<< \n Your custom message go here';
}
})
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<asp:TextBox runat="server" ID="txtbox" />
</td>
</tr>
<tr>
<td>
<asp:Button Text="button" runat="server" ID="btn" />
</td>
</tr>
<tr>
<td>
<asp:DropDownList runat="server" ID="ddl">
<asp:ListItem Text="One" />
<asp:ListItem Text="Two" />
</asp:DropDownList>
</td>
</tr>
<tr>
<td>
<asp:CheckBox Text="Check" runat="server" ID="chk" />
</td>
</tr>
<tr>
<td>
<asp:RadioButtonList runat="server" ID="radio">
<asp:ListItem Text="One" />
<asp:ListItem Text="Two" />
</asp:RadioButtonList>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
(function ($) {
if (typeof $ !== 'function') {
throw new Error('jQuery required');
}
/* The time in milliseconds to allow between a __doPostBack call and
showing the onbeforeunload message. */
var allowedWaitTime = 100,
timeStamp = new Date().getTime(),
// Each function to override
baseFuncs = {
__doPostBack: this.__doPostBack,
WebForm_DoPostBackWithOptions: this.WebForm_DoPostBackWithOptions
};
// Set timeStamp when each baseFunc is called
for (var baseFunc in baseFuncs) {
(function (func) {
this[func] = function () {
var baseFunc = baseFuncs[func];
timeStamp = new Date().getTime();
if (typeof baseFunc === 'function') {
baseFunc.apply(arguments.callee, arguments);
}
}
})(baseFunc);
}
/* Form submit buttons don't call __doPostBack so we'll set timeStamp
manually on click. */
$('input[type="submit"]').click(function () {
timeStamp = new Date().getTime();
});
$(this).on('beforeunload', function (e) {
// Only return string if allowedWaitTime has elapsed
if (e.timeStamp - timeStamp > allowedWaitTime) {
return 'message';
}
});
}).call(window, jQuery);