转:
http://www.cnblogs.com/Tim_Liu/archive/2010/11/25/1887937.html
最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了UpdatePannel,然后也用上了Jquery的插件做效果,然而当updatepannel中按钮点击后,jquery代码及样式都不见了,因为之前遇到过js类似的问题,所以就特意查了下网络上各大虾的解说,以下总结下大虾门的说法,顺便将自己的写法也记录下来。
以下是 LanceZhang's Tech Blog:原文地址 http://www.cnblogs.com/blodfox777/archive/2008/12/08/1347805.html
问题重现:
2 . 在UpdatePanel中添加元素A
3 . 用jQuery对元素A添加X效果
4 . 在UpdatePanel中加一个Button B用作postback
结果:在第一次页面加载时,元素A的X效果正常,点击B之后,页面局部刷新,此时,元素A失去X效果
分析1:UpdatePanel
UpdatePanel在应用中主要用于局部刷新,避免整个页面的Postback。
UpdatePanel实现局部刷新的核心在于MicrosoftAjaxWebForm.js文件,它的局部刷新过程就是将页面提交到服务端(包含ViewState),执行服务端代码后异步将在UpdatePanel内的HTML进行重新呈现。
在此过程中,页面的其它部分并没有状态更改。
分析2:jQuery
jQuery可以通过简单的代码对HTML元素添加各种属性和事件句柄,我们可以在这里看到官方的文档:
Tutorials:How jQuery Works http://docs.jquery.com/How_jQuery_Works
在这里,我们可以得知,jQuery有个重要的事件标记“ready”,一般对HTML元素的效果和事件句柄都通过这个ready事件来添加,如下:
官方对此的说明是:ready事件会在DOM完全加载后运行一次,OK,至此,问题的原因差不多明白了:
原因:
因为在UpdatePanel局部刷新之后,其中的元素A被重写,而此时整个DOM树并没有重新加载,所以jQuery的ready事件并没有触发,所以元素A就失去了原有的特效。
解决方案:
我们可以将ready事件中执行的代码提取出来,然后通过捕获ScriptManager的EndRequest事件,在每次UpdatePanel局部刷新之后执行一次jQuery初始化代码,如下所示:
function EndRequestHandler() { ReadyFunction1(); ReadyFunction2(); ReadyFunction3(); } </ script > < body onload ="load()" >
<link href=
"CSS/jquery-ui-1.8.6.custom.css"
rel=
"stylesheet"
type=
"text/css"
/>
<script src=
"Scripts/jquery-1.4.2.min.js"
type=
"text/javascript"
></script>
<script src=
"Scripts/jquery-ui-1.8.6.custom.min.js"
type=
"text/javascript"
></script>
<script language=
"javascript"
type=
"text/javascript"
>
$().ready(function () {
<span style=
"color: rgb(255, 0, 0);"
> load();
</span> addTabs();
});
function addTabs() {
$(
"#tabs"
).tabs();
}
function <span style=
"color: rgb(255, 0, 0);"
>load() </span>{
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(<span style=
"color: rgb(255, 0, 0);"
>EndRequestHandler</span>);
}
function <span style=
"color: rgb(255, 0, 0);"
>EndRequestHandler()</span> {
addTabs();
}
</script>
|
<asp:ScriptManager ID=
"SM1"
runat=
"server"
>
</asp:ScriptManager>
<div id=
"tabs"
>
<ul>
<li><a href=
"#tabs-1"
>Nunc tincidunt</a></li>
<li><a href=
"#tabs-2"
>Proin dolor</a></li>
<li><a href=
"#tabs-3"
>Aenean lacinia</a></li>
</ul>
<div id=
"tabs-1"
>
<p>
Tab 1 content</p>
</div>
<div id=
"tabs-2"
>
<asp:UpdatePanel ID=
"Up_1"
runat=
"server"
>
<contenttemplate>
<p>
Tab 2 content</p>
<asp:Button ID=
"Button1"
runat=
"server"
Text=
"Button"
onclick=
"Button1_Click"
/></contenttemplate>
<triggers>
<asp:AsyncPostBackTrigger ControlID=
"Button1"
EventName=
"Click"
/>
</triggers> </asp:UpdatePanel>
</div>
<div id=
"tabs-3"
>
<p>
Tab 3 content</p>
</div>
</div>
|