Ajax更新后重新绑定jQuery中的事件(updatepanel)

时间:2008-11-19 10:26:45

标签: asp.net jquery asp.net-ajax updatepanel

我的页面上有几个输入和选项元素,每个(几乎都有)附加了一个事件,一旦更改,就会更新页面上的一些文本。我使用的jQuery非常酷:)

我还使用了微软Ajax框架,利用了UpdatePanel。我这样做的原因是某些元素是基于某些服务器端逻辑在页面上创建的。我真的不想解释为什么我使用UpdatePanel - 即使它可以(可以付出相当大的努力)被重写为仅使用jQuery我仍然想要UpdatePanel。

你可能已经猜到了 - 一旦我在UpdatePanel上回发,jQuery事件就会停止工作。我实际上是在期待这个,因为“回发”并不是真正的新回发所以我在document.ready中绑定事件的代码将不再被触发。我还通过在jQuery帮助库中阅读它来证实了我的怀疑。

无论如何,在UpdatePanel更新DOM之后,我仍然遇到重新绑定控件的问题。我最好需要一个不需要向页面添加更多.js文件(jQuery插件)的解决方案,但是能够捕获UpdatePanel的'afterupdating'这样简单,我可以调用我的方法重新绑定所有表单元素

9 个答案:

答案 0 :(得分:83)

由于您使用的是ASP.NET AJAX,因此您可以访问pageLoad事件处理程序,每次页面回发时都会调用该事件处理程序,无论是全局还是部分来自UpdatePanel。您只需将该功能放入您的页面,不需要连接。

function pageLoad(sender, args)
{
   if (args.get_isPartialLoad())
   {
       //Specific code for partial postbacks can go in here.
   }
}

答案 1 :(得分:23)

或者您可以通过on()方法检查最新的jQuery实时功能。

答案 2 :(得分:21)

Sys.Application.add_load(initSomething);
function initSomething()
{
  // will execute on load plus on every UpdatePanel postback
}

答案 3 :(得分:14)

从jQuery 1.7开始,推荐的方法是使用jQuery's .on()语法。

但请确保您在文档对象上设置事件,而不是在DOM对象本身上设置事件。例如,这将在UpdatePanel回发后中断

$(':input').on('change', function() {...});

...因为':输入'已被重写。这样做:

$(document).on('change', ':input', function() {...});

只要文档存在,任何输入(包括UpdatePanel刷新的输入)都将触发更改处理程序。

答案 4 :(得分:9)

使用以下代码

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded);

function pageLoaded(sender, args) {
    var updatedPanels = args.get_panelsUpdated();
    // check if Main Panel was updated 
    for (idx = 0; idx < updatedPanels.length; idx++) {
        if (updatedPanels[idx].id == "<%=upMain.ID %>") {
            rebindEventsForMainPanel();
            break;
        }
    }
}

答案 5 :(得分:8)

您可以使用jQuery和事件委派。基本上将事件挂钩到容器而不是每个元素,并查询event.target并根据它运行脚本。

它有多种好处,可以减少代码噪音(无需重新绑定)。它是 浏览器内存也更容易(DOM中绑定的事件更少。)

快速示例here

jQuery plugin便于事件委派。

P.S我99%肯定代表团将在下一个版本中使用jQuery核心。

答案 6 :(得分:5)

使用以下代码,您需要验证控件是否将使用datepicker:

    <script type="text/javascript" language="javascript">

         Sys.WebForms.PageRequestManager.getInstance().add_endRequest(addDataPicker); 
         function addDataPicker(sender, args)
         {
            var fchFacturacion = document.getElementById('<%= txtFechaFacturacion.ClientID %>');
            if (fchFacturacion != null) {
               $(fchFacturacion).datepicker({ onSelect: function () { }, changeMonth: true, changeYear: true, showOn: 'button', buttonImage: '../Imagenes/calendar.gif', buttonImageOnly: true});}
         } 

    </script>

     <asp:UpdatePanel ID="upEjem" runat="server" UpdateMode="Conditional">
       <ContentTemplate>
              <div id="div1" runat="server" visible="false">
                  <input type="text" id="txtFechaFacturacion" 
                      name="txtFechaFacturacion" visible="true"
                      readonly="readonly" runat="server" />
              </div>
       </ContentTemplate>
     </asp:UpdatePanel>

答案 7 :(得分:4)

             

         <script type="text/javascript">
             function pageLoad() {

                 if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {


       }

            </script>

        </ContentTemplate>
    </asp:UpdatePanel>

进入“if”,每次updatepanel执行AsyncPostBack时,你都可以放置你需要执行的代码。

答案 8 :(得分:2)

使用jQuery的新“live”方法绑定您的事件。它会将事件绑定到您现有的所有元素以及所有未来元素。查清! :)