我一直忙着在我们的自定义CRM工作中实现JQuery。在这个过程中,我创建了一个带边框的面板,它的标题中有一个简单的按钮,根据当前状态,它会折叠或展开内容。现在要记住面板的状态我正在使用jquery cookie库,当提交页面时为该控件设置一个cookie,然后当页面重新加载时,它会读取并重置面板到它的最后状态。
问题一是让JQuery在页面提交时执行,因为ASP.NET接管了这个并且不会在表单上调用submit()函数。为了解决这个问题,我发现http://kenbrowning.blogspot.com/2009/01/supporting-jquerys-formsubmit-in-aspnet.html似乎几乎完美无缺。
但是......经过进一步的测试,我发现这将阻止任何在UpdatePanel中发生的回发,以完成一个完整的Postback,而不是面板中的异步回发。我意识到UpdatePanels现在有点过时,但它们遍布我们的网站,所以为了使用这个控件,它必须与它们很好地协同工作。
那么,无论如何确定是否发生了异步回发?基本上我希望能够做到这样的事情:
if (IsAsyncPostback) {
theForm.submit(); //this seems to still fire the async postback, but doesn't call the jquery which is setup to save the state..
} else {
$(theForm).submit(); //this is from the link, which cause all postbacks to be full on postbacks, even if they are in an updatepanel
}
帮助,我已经四处寻找并且找不到任何有用的东西..当然,我不能成为唯一一个尝试过这个的人吗?
答案 0 :(得分:2)
我会避免干扰__doPostBack()
功能。
我认为你想要的是处理PageRequestManager的beginRequest
或endRequest
事件。这将在每次UpdatePanel刷新后运行您的代码,例如:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function() {
if ($('#panelID').is(':hidden'))
$.cookie('#panelID', 'true');
else
$.cookie('#panelID', 'false');
});
如果你真的想改变__doPostBack()
,最好采用这种方法:
var oldDoPostBack = window.__doPostBack;
window.__doPostBack = function(target, arg) {
// Trigger a custom event, to track when this occurs.
$(window).trigger('doPostBack');
// Call the real __doPostBack() function;
oldDoPostBack(target, arg);
}
然后,您可以绑定到该自定义事件,以便在从任何来源触发__doPostBack()
时执行操作:
$(window).bind('doPostBack', function() {
alert('__doPostBack is about to execute.');
});
这里的一个重要优势是你没有重新定义__doPostBack()
,所以你破坏它的机会就会减少。
我建议坚持使用内置的PageRequestManager事件,除非您确实需要捕获__doPostBack()
事件,原因是其他原因。
答案 1 :(得分:0)