Rebinding de eventos en jQuery después de la actualización Ajax (updatepanel)


Tengo varios elementos de entrada y opción en mi página, cada uno (bueno casi) tiene un evento adjunto para actualizar algún texto en la página una vez que cambian. Yo uso jQuery que es realmente muy bueno:)

También uso Microsofts Ajax framework, utilizando el UpdatePanel. La razón por la que hago eso es que ciertos elementos se crean en la página basada en alguna lógica del lado del servidor. Realmente no quiero explicar por qué uso el UpdatePanel, incluso si pudiera (puede con bastante esfuerzo) ser reescrito para usar solo jQuery Todavía quiero que UpdatePanel.

Probablemente lo adivinaste - una vez que tengo un postback en el UpdatePanel, los eventos jQuery dejan de funcionar. En realidad estaba esperando esto, ya que el" postback " no es realmente un nuevo postback por lo que mi código en el documento.listo que une los eventos no se disparará de nuevo. También confirmé mi sospecha leyendo sobre él en las bibliotecas de ayuda de jQuery.

De todos modos me quedo con el problema de volver a vincular mis controles después de que el UpdatePanel haya terminado de actualizar el DOM . Preferiblemente necesito una solución que no requiera agregar más .js archivos (jQuery plug-ins) a la página, pero algo tan simple como ser capaz de coger el UpdatePanel 'afterupdating' donde puedo llamar a mi método para volver a enlazar todos los elementos del formulario.

Author: Peter Mortensen, 2008-11-19

9 answers

Ya que estás usando ASP.NET AJAX, tendrás acceso a un controlador de eventos pageLoad, que se llama cada vez que la página vuelve a publicar, ya sea completo o parcial desde un UpdatePanel. Solo necesita poner la función en su página, no se requiere conexión.

function pageLoad(sender, args)
{
   if (args.get_isPartialLoad())
   {
       //Specific code for partial postbacks can go in here.
   }
}
 83
Author: Phil Jenkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 10:51:04

O puede comprobar la última funcionalidad en vivo de jQuery a través de la on() método.

 23
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-26 06:08:49
Sys.Application.add_load(initSomething);
function initSomething()
{
  // will execute on load plus on every UpdatePanel postback
}
 22
Author: Paulius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-20 08:32:40

A partir de jQuery 1.7, la forma recomendada de hacerlo es usar jQuery .on () sintaxis.

Asegúrese, sin embargo, de configurar el evento en el objeto document, no en el objeto DOM en sí. Por ejemplo, esto se romperá después del postback de UpdatePanel :

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

... porque los': inputs ' han sido reescritos. Haga esto en su lugar:

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

Mientras el documento esté disponible, cualquier entrada (incluidas las de las actualizaciones de UpdatePanel) se activará el manejador de cambios.

 14
Author: lambinator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-01 17:21:00

Utilice el siguiente código

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;
        }
    }
}
 9
Author: shatl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-29 10:05:56

Puede usar jQuery y delegación de eventos. Básicamente engancha eventos a contenedores en lugar de a cada elemento y consulta el evento.objetivo y ejecutar script basado en eso.

Tiene múltiples beneficios en que reduce el ruido del código (no es necesario volver a enlazar). Es también es más fácil en la memoria del navegador (menos eventos vinculados en el DOM.)

Ejemplo Rápido aquí.

JQuery plugin para facilitar la delegación de eventos.

P. S Estoy 99% seguro de que la delegación estará en el núcleo de jQuery en el próximo lanzamiento.

 8
Author: redsquare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-17 12:28:17

Use el siguiente código, necesita validar el control usará el datapicker:

    <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>
 5
Author: rocke_amiga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-04 16:21:02

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

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


       }

            </script>

        </ContentTemplate>
    </asp:UpdatePanel>

En el "if" puede poner el código que necesita ejecutar cada vez que el updatepanel hace AsyncPostBack.

 4
Author: civanm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-12 14:53:19

Enlaza tus eventos usando el nuevo método 'live' de jQuery. Vinculará los eventos a todos sus elementos presentes y a todos los futuros también. ¡Cha ching! :)

 2
Author: John Strickler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 19:33:13