2008-11-19 3 views
76

У меня есть несколько элементов ввода и параметров на моей странице, каждая из которых (почти почти) имеет событие, связанное с обновлением некоторого текста на странице после их изменения. Я использую jQuery, который действительно очень крут :)Перестановка событий в jQuery после обновления Ajax (updatepanel)

Я также использую рамки Microsoft Ajax, используя UpdatePanel. Причина, по которой я делаю это, состоит в том, что определенные элементы создаются на странице на основе некоторой логики на стороне сервера. Я действительно не хочу объяснять, почему я использую UpdatePanel - даже если бы он мог (с некоторыми усилиями) перезаписать для использования только jQuery Я все еще хочу, чтобы UpdatePanel.

Возможно, вы это догадались - как только у меня есть обратная передача на UpdatePanel, события jQuery перестают работать. Я действительно ожидал этого, поскольку «postback» на самом деле не является новой обратной передачей, поэтому мой код в document.ready, который связывает события, больше не будет запущен. Я также подтвердил свое подозрение, прочитав его в библиотеках справки jQuery.

В любом случае у меня возникла проблема с повторным подключением элементов управления после обновления UpdatePanel с обновлением DOM. Мне предпочтительно нужно решение, которое не требует добавления на страницу большего количества файлов .js (плагинов jQuery), но что-то такое же простое, как возможность улавливать «afterupdating» UpdatePanel, где я могу просто вызвать мой метод для повторной привязки всех элементов формы ,

+0

Это очень похоже на этот вопрос: http://stackoverflow.com/questions/256195/jquery-document-ready-and-updatepanels – 2009-11-09 02:07:35

ответ

83

Поскольку вы используете ASP.NET AJAX, у вас будет доступ к обработчику событий pageLoad, который вызывается каждый раз, когда страница возвращается, будь то полная или частичная из UpdatePanel. Вам просто нужно включить функцию на свою страницу, не требуется подключение.

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

Вы правы! Спасибо :) – 2008-11-19 10:39:19

+1

Нет проблем - это всего лишь один способ сделать это кстати. Если вам нужна большая гибкость, проверьте событие endRequest в классе PageRequestManager. – 2008-11-19 10:43:14

+0

Удивительный! Я заменил свой jquery $ (document). Уже с вашей страницей (без блока if), и она решила мою проблему! – Chris 2009-07-10 04:16:42

8

Вы можете использовать jQuery и делегирование событий. В основном, перехватывают события в контейнерах, а не каждый элемент, и запрашивают сценарий event.target и запускают на основе этого.

У этого есть много преимуществ в том, что вы уменьшаете шум кода (нет необходимости переустанавливать). Это также проще в памяти браузера (меньше событий, связанных с DOM.)

Быстрый пример here.

jQuery plugin для упрощения проведения мероприятий.

P.S Я на 99% уверен, что делегация будет в ядре jQuery в следующем выпуске.

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

Это работало очень хорошо для меня, чтобы сделать работу по управлению ASP.NET JQuery внутри панели обновления. – Earlz 2010-05-20 17:43:01

23

Или вы можете проверить последние функциональные возможности jQuery с помощью метода on().

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; 
     } 
    } 
} 
4

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

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


     } 

      </script> 

     </ContentTemplate> 
    </asp:UpdatePanel> 

в из "если" вы можете поместить код, который нужно выполнять каждый раз, когда UpdatePanel делает AsyncPostBack.

2

Связать свои события, используя новый «живой» метод jQuery. Он привяжет события ко всем вашим нынешним элементам и всем будущим. Ча цзин!:)

5

Используйте следующий код, Вы должны подтвердить контроль будет использовать 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> 
14

По JQuery 1.7, рекомендуемый способ сделать это состоит в использовании jQuery's .on() синтаксиса.

Убедитесь, что вы установили событие на объекте , а не на объект DOM. Например, это сломается после UpdatePanel постбэка:

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

... потому что: были переписаны 'входы'. Сделайте это вместо того, чтобы:

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

Пока документ находится вокруг, все входы (в том числе из UpdatePanel освежающим) вызовет обработчик изменения.