zoukankan      html  css  js  c++  java
  • JQuery和UpdatePannel的问题

    最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了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 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: #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);
        }
     
     
  • 相关阅读:
    Java学习笔记-函数
    Java学习笔记-数组
    Git 常用命令速查表
    $.fn与$.fx什么意思; $.extend与$.fn.extend用法区别; $(function(){})和(function(){})(jQuery)
    offsetWidth的bug
    jQuery对象和DOM对象转换,解决jQuery对象不能使用js方法的问题
    1
    $().ready()与window.onload的不同
    offsetHeight在不同的浏览器下取值不同
    getElementsByName兼容ie 但并不是兼容ie下的所有标签
  • 原文地址:https://www.cnblogs.com/panmy/p/5380534.html
Copyright © 2011-2022 走看看