转:

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

问题重现:


. 在页面中添加ScriptManager和UpdatePanel
 
. 在UpdatePanel中添加元素A
 
. 用jQuery对元素A添加X效果
 
. 在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 onload="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: 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>

方法2: protected void Button1_Click(object sender, EventArgs e)     {         ScriptManager.RegisterStartupScript(this.Up_1, this.GetType(), "asdfas", "addTabs();", true);     }

最新文章

  1. SignalR入门之Hub
  2. 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)
  3. FruitFrolic
  4. 【线段树】bzoj1756 Vijos1083 小白逛公园
  5. linux 学习 设置固定网Ip
  6. C语言:break和continue
  7. 一千行MySQL学习笔记
  8. PHP vs Python
  9. BPDU与PortFast
  10. C# 中使用win32函数 GetScrollInfo返回false 返回引用全是零的问题
  11. mysql导出部分数据的几种方法(摘录)
  12. 小记:对Android网络下载工具的初步封装!(包括json,字符串下载(volley),和图片下载(glide))
  13. zookeeper_02:zookeeper基础
  14. Log4J logger图片
  15. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1
  16. OpenGL shader渲染贴图
  17. tomcat server.xml结构
  18. Mybatis 源码学习系列
  19. 如何恢复Eclipse中被误删除的文件
  20. java基础----&gt;String中replace和replaceAll方法

热门文章

  1. WebViewJavascriptBridge
  2. Session里的对象是不可靠的!
  3. 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网
  4. 虚拟机下ubuntu的minicom使用指南
  5. 【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)
  6. [wikioi]数的划分
  7. Wide character in print at a2.pl line 返回json 需要encode_utf8
  8. 17.1.1 How to Set Up Replication 设置复制:
  9. java学习之创建线程方法二
  10. 无法使用以下搜索标准找到 X.509 证书: StoreName“My”、StoreLocation“LocalMachine”、FindType“FindBySubjectName”、FindValue“MyWebSite”。