我正在使用此jquery代码来检测未保存的更改,并在用户离开之前发出警告。
var _changesMade = false;
$(document).ready(function () {
$('form').bind($.browser.msie ? 'propertychange' : 'change', function () {
_changesMade = true;
});
$(window).bind('beforeunload', function () {
if (_changesMade)
return 'There are unsaved changes which will be lost if you continue.';
});
});
它工作正常,除了在我有一个级联下拉列表的页面上。我将此代码添加到asp:DropDownList控件
onChange = "_changesMade=false; return false;"
并且它会停止警告,但它也会停止执行OnSelectedIndexChanged服务器代码,所以现在第二个下拉列表没有填充正确的数据。如何更改下拉列表时,如何阻止弹出窗口并仍然执行服务器代码?
答案 0 :(得分:0)
我不知道这是否是最好的答案,但它可以帮到你。你可以这样试试。
删除OnSelectedIndexChanged
ASPX
在aspx.cs的PageLoad
方法中试试这个
protected void Page_Load(object sender, EventArgs e)
{
this.YourDropDownList.Attributes.Add("onchange", "javascript:_changesMade=false; __doPostBack('" + YourDropDownList.ClientId +"','');";
}
Here对于使用ASP.net框架自动生成的__doPostBack
方法可以做些什么有点了解。
希望它对你有所帮助。
答案 1 :(得分:0)
问题是级联下拉列表返回false。这将阻止SelectedIndexChanged触发,因此您需要一个不使用它的解决方案。
如果要将标记放在您不想参与更改跟踪的控件上,例如级联下拉列表中的父级。我可能想要使用notrack
(任意名称)这样的类,我可以弹出任何我不想跟踪的控件。
您的跟踪绑定将成为
$(':input').not('.notrack').bind($.browser.msie ? 'propertychange' : 'change', function ()
{
_changesMade = true;
});
这意味着你不会穿上
onChange = "_changesMade=false; return false;"
这个实例中的返回false导致了问题,而这就是需要进行的操作
顺便说一句,我认为您不需要对绑定进行任何特定的浏览器检查。 JQuery会考虑到这一点。我相信下面的代码应该足够了
$(':input').not('.notrack').bind('change', function ()
{
_changesMade = true;
});
如果您需要在回发之间跟踪_changesMade
标记(从您的描述中看起来像你可能的那样),那么请考虑将值存储在隐藏字段中。如果您创建隐藏字段runat="server"
,那么您也可以通过服务器端代码对其进行操作,这可能会对您有所帮助。
修改强>
这与您的预期略有不同。这将跟踪每个表单元素的更改,并将表单标记为已更改(如果有任何更改)。这就是我过去使用这种东西的方式。我不认为在这种情况下跟踪整个表单会起作用,因为您需要排除某些字段。我还会使用隐藏字段来跟踪您的更改。