JQuery和UpdatePannel的问题

本文探讨了在ASP.NET项目中使用UpdatePanel与jQuery插件时遇到的冲突问题,具体阐述了问题的重现过程、原因分析及解决方案。通过实例展示了如何在局部刷新后重新初始化jQuery代码,确保页面元素的样式和交互效果得以保留。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了UpdatePannel,然后也用上了Jquery的插件做效果,然而当updatepannel中按钮点击后,jquery代码及样式都不见了,因为之前遇到过js类似的问题,所以就特意查了下网络上各大虾的解说,以下总结下大虾门的说法,顺便将自己的写法也记录下来。

以下是 LanceZhang's Tech Blog:原文地址 http://www.cnblogs.com/blodfox777/archive/2008/12/08/1347805.html

问题重现:

复制代码
1. 在页面中添加ScriptManager和UpdatePanel

 

 

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事件来添加,如下:

$(document).ready(function () {
    $("p").text("The DOM is now loaded and can be manipulated.");
});

 

官方对此的说明是:ready事件会在DOM完全加载后运行一次,OK,至此,问题的原因差不多明白了:

原因:

因为在UpdatePanel局部刷新之后,其中的元素A被重写,而此时整个DOM树并没有重新加载,所以jQuery的ready事件并没有触发,所以元素A就失去了原有的特效。

解决方案:

我们可以将ready事件中执行的代码提取出来,然后通过捕获ScriptManager的EndRequest事件,在每次UpdatePanel局部刷新之后执行一次jQuery初始化代码,如下所示:

复制代码
    <script type="text/javascript">
        function load() {
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
        }

 

 

function EndRequestHandler() {
            ReadyFunction1();
            ReadyFunction2();
            ReadyFunction3();
        }
    </script>

 

 

<body οnlοad="load()">
复制代码
以下是我试验的代码(注意红色标示的代码)
实现方式1:
<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: #ff0000;" >   load();
</span>            addTabs();
         });
 
         function addTabs() {
             $( "#tabs" ).tabs();
         }
 
         function <span style= "color: #ff0000;" >load() </span>{
             Sys.WebForms.PageRequestManager.getInstance().add_endRequest(<span style= "color: #ff0000;" >EndRequestHandler</span>);
         }
 
         function <span style= "color: #ff0000;" >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>
方法2:
protected void Button1_Click(object sender, EventArgs e)
    {
        ScriptManager.RegisterStartupScript(this.Up_1, this.GetType(), "asdfas", "addTabs();", true);
    }
 
 

转载于:https://www.cnblogs.com/panmy/p/5380534.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值