2010-08-06 3 views
2

В моем файле ASPX, у меня есть:Второй раз нажмите на кнопку внутри UpdatePanel, событие не срабатывает в JQuery

<asp:UpdatePanel ID="UpdatePanel3" UpdateMode="Always" runat="server"> 
    <ContentTemplate> 
     <asp:Button ID="Button1" runat="server" Text="Button" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

В моем файле JavaScript У меня есть:

$('#ctl00_ContentPlaceHolder1_Button1').click(function (e) { 
     alert('hello'); 
    }); 

Но только в первый раз нажмите кнопку, я получил alert('hello') и больше никаких предупреждающих сообщений.

ответ

2

Для динамического содержимого, используйте .live() метод JQuery в.

$('#ctl00_ContentPlaceHolder1_Button1').live('click', function (e) { 
    alert('hello'); 
}); 

Кроме того, я бы рекомендовал использовать класс вместо идентификатора. Использование идентификатора является хрупким для любых изменений кода, которые влияют на структуру/структуру управления ASP.NET:

<asp:Button ID="Button1" runat="server" Text="Button" class="performsMyClickAction" /> 

$('.performsMyClickAction').live('click', function (e) { ... } 
+0

ха-ха да, используя живой рабочий тон. Отлично! Большое спасибо! – olidev

+1

Спасибо, потому что я использую несколько div с тем же классом css, и мне нужно сделать некоторые события для определенного div, поэтому я вызываю div, используя его идентификатор. Спасибо за советы! – olidev

+0

Вместо того, чтобы использовать атрибут 'class' в проектах WebForms, я использую селектор End-Of для учета только конца идентификатора. В этом случае селектором будет: '$ ('input [id $ = Button1]'). Live()', где комбинация, равная доллару, соответствует концу атрибута 'id'. Таким образом, это будет игнорировать раздражающий длинный префикс. – timmi4sa

0

Мне интересно, почему у вас есть ваш селектор как # ct_100_ContenPlaceHolder1_Button1. Я переключил его на # Button1, и он, похоже, отлично работал для меня.

+0

Потому что вы не разместили его внутри PLaceHolder. Он отлично работает в первый раз, но второй раз он не срабатывал :( – olidev

0

Когда UpdatePanel выполняет асинхронный обратный вызов, вы теряете регистрацию событий jquery, потому что содержимое панели полностью заменяется.

Вы можете выполнить больше JavaScript для повторной проводки, добавив регистрацию скрипта менеджеру сценариев во время обратного вызова. Что-то вроде этого вы должны получить близко (в стороне сервера обработчик щелчка вашей баттона):

ScriptManager.RegisterStartupScript(
    this, 
    GetType(), 
    "AnyStringYouWant", 
    "$('#ctl00_ContentPlaceHolder1_Button1').click(function (e) {alert('hello');});", 
    true); 
+0

это звучит интересно! Не могли бы вы сообщить мне, где его разместить? – olidev

+0

Похоже, у вас уже есть ответ, но в ответ к вашему комментарию, вы можете использовать этот код в своем коде, вероятно, где-нибудь до этапа Render жизненного цикла страницы. OnLoad должен быть в порядке. – kbrimington

+0

Да, это работает отлично, но я предпочитаю использовать «живой» в качестве ответа выше в jQuery.Это работает супер! Спасибо! – olidev

Смежные вопросы