Перестановка событий в jQuery после обновления Ajax (обновленная панель)
У меня есть несколько элементов ввода и опции на моей странице, каждая из которых (ну почти) имеет событие, связанное с обновлением какого-либо текста на странице после их изменения. Я использую jQuery, который действительно очень классный:)
Я также использую Microsoft Ajax, используя UpdatePanel. Причина, по которой я делаю это, состоит в том, что определенные элементы создаются на странице на основе некоторой логики на стороне сервера. Я действительно не хочу объяснять, почему я использую UpdatePanel, даже если бы он мог (с некоторыми усилиями) перезаписать, чтобы использовать только jQuery Мне все еще нужна эта UpdatePanel.
Вы, наверное, догадались - когда у меня есть обратная передача в UpdatePanel, события jQuery перестают работать. Я действительно ожидал этого, поскольку "postback" на самом деле не является новой обратной передачей, поэтому мой код в document.ready, который связывает события, больше не будет запущен. Я также подтвердил свое подозрение, прочитав его в библиотеках справки jQuery.
В любом случае у меня осталась проблема восстановления моих элементов управления после обновления UpdatePanel с обновлением DOM. Мне предпочтительно нужно решение, которое не требует добавления на страницу большего количества файлов .js(плагинов jQuery), но что-то настолько же просто, как возможность поймать UpdatePanel "afterupdating", где я могу просто вызвать мой метод для перепроверки всех элементов формы.
Ответы
Ответ 1
Поскольку вы используете ASP.NET AJAX, у вас будет доступ к обработчику событий pageLoad
, который будет вызываться каждый раз, когда страница будет возвращена, будь то полная или частичная из UpdatePanel. Вам просто нужно включить функцию на свою страницу, не требуется подключение.
function pageLoad(sender, args)
{
if (args.get_isPartialLoad())
{
//Specific code for partial postbacks can go in here.
}
}
Ответ 2
Или вы можете проверить последние функции jQuery в реальном времени с помощью метода on()
.
Ответ 3
Sys.Application.add_load(initSomething);
function initSomething()
{
// will execute on load plus on every UpdatePanel postback
}
Ответ 4
Как и в jQuery 1.7, рекомендуется использовать jQuery.on() синтаксис.
Убедитесь, что вы настроили событие на документе, а не на объект DOM. Например, это будет прервано после обратной передачи UpdatePanel:
$(':input').on('change', function() {...});
... потому что ': input' были переписаны. Сделайте это вместо:
$(document).on('change', ':input', function() {...});
Пока документ находится вокруг, любые входы (в том числе обновления UpdatePanel) будут запускать обработчик изменений.
Ответ 5
Используйте следующий код
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;
}
}
}
Ответ 6
Вы можете использовать jQuery и делегирование событий. В основном, перехватывают события в контейнерах, а не каждый элемент, и запрашивают event.target и запускают script на основе этого.
Он имеет множество преимуществ в том, что вы уменьшаете уровень шума кода (нет необходимости перепроверять). это
также проще в памяти браузера (меньше событий, связанных с DOM.)
Быстрый пример здесь.
плагин jQuery для упрощения делегирования событий.
P.S Я на 99% уверен, что делегирование будет в ядре jQuery в следующей версии.
Ответ 7
Используйте следующий код. Вам нужно проверить, что элемент управления будет использовать 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>
Ответ 8
<script type="text/javascript">
function pageLoad() {
if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {
}
</script>
</ContentTemplate>
</asp:UpdatePanel>
into в "if" вы можете поместить код, который вам нужно выполнить каждый раз, когда панель обновления делает AsyncPostBack.
Ответ 9
Привяжите свои события, используя новый метод 'live' jQuery. Он привяжет события ко всем вашим нынешним элементам и всем будущим. Cha ching!:)