Я использую jQuery для подключения некоторых эффектов наведения мыши на элементах внутри UpdatePanel. События связаны в $(document).ready
. Например:
$(function() {
$('div._Foo').bind("mouseover", function(e) {
// Do something exciting
});
});
Конечно, это работает нормально при первой загрузке страницы, но когда UpdatePanel выполняет частичное обновление страницы, он не запускается и эффекты наведения мыши больше не работают внутри UpdatePanel.
Каков рекомендуемый подход для подключения компонентов в jQuery не только при первой загрузке страницы, но и каждый раз, когда UpdatePanel запускает частичное обновление страницы? Должен ли я использовать жизненный цикл ASP.NET ajax вместо $(document).ready
?
javascript
jquery
asp.net
asp.net-ajax
jquery-events
Херб Каудилл
источник
источник
Ответы:
UpdatePanel полностью заменяет содержимое панели обновления при обновлении. Это означает, что те события, на которые вы подписались, больше не подписываются, поскольку в этой панели обновлений есть новые элементы.
Чтобы обойти это, я переподписывался на события, которые мне нужны после каждого обновления. Я использую
$(document).ready()
для начальной загрузки, затем использую MicrosoftPageRequestManager
(доступно, если у вас есть панель обновлений на вашей странице), чтобы переподписывать каждое обновление.Это
PageRequestManager
объект javascript, который автоматически доступен, если на странице есть панель обновления. Вам не нужно ничего делать, кроме приведенного выше кода, чтобы использовать его, пока панель обновления находится на странице.Если вам нужен более подробный контроль, это событие передает аргументы, аналогичные тому, как события .NET передаются аргументы,
(sender, eventArgs)
так что вы можете видеть, что вызвало событие, и выполнять только повторную привязку, если это необходимо.Вот последняя версия документации от Microsoft: msdn.microsoft.com/.../bb383810.aspx
Лучший вариант, который вы можете иметь, в зависимости от ваших потребностей, это использовать jQuery
.on()
. Эти методы более эффективны, чем повторная подписка на элементы DOM при каждом обновлении. Однако, прежде чем использовать этот подход, прочитайте всю документацию, поскольку она может соответствовать или не соответствовать вашим потребностям. Существует множество плагинов jQuery, которые было бы неразумно использовать для рефакторинга.delegate()
или.on()
, поэтому в этих случаях вам лучше переподписаться.источник
.delegate()
был заменен.on()
.live(...)
был официально объявлен устаревшим в 1.7 и может быть удален в следующей версии. Я намеренно выбрал,.delegate()
поскольку он уже некоторое время поддерживается в jQuery и вряд ли будет удален в ближайшее время. Тем не менее, я уточню свой ответ, чтобы упомянуть.on()
и тех, кто может его использовать.jQuery.delegate()
больше. Он был заменен тем,jQuery.on()
который является предпочтительным API для использования.delegate()
это просто обертка для конкретного использованияon()
, и вполне возможно, что в будущем это может устареть. Мой предыдущий комментарийdelegate()
был написан более года назад, когдаon()
был выпущен jQuery 1.7 (который представил API). Поскольку jQuery 1.9 уже выпущен и 2.0 в бета-версии готовится к выпуску, рекомендуется избегать использованияdelegate()
в любом новом коде.Площадь, которая будет обновляться.
источник
Пользовательский элемент управления с jQuery внутри UpdatePanel
Это не прямой ответ на вопрос, но я соединил это решение, прочитав ответы, которые нашел здесь, и подумал, что кто-то может найти его полезным.
Я пытался использовать ограничитель текстовой области jQuery внутри пользовательского элемента управления. Это было сложно, потому что пользовательский элемент управления работает внутри UpdatePanel, и он терял свои привязки при обратном вызове.
Если бы это была просто страница, ответы здесь были бы применены напрямую. Однако пользовательские элементы управления не имеют прямого доступа к тегу head и не имеют прямого доступа к UpdatePanel, как предполагают некоторые ответы.
Я закончил тем, что поместил этот блок сценария прямо в разметку моего пользовательского элемента управления. Для начального связывания он использует $ (document) .ready, а затем использует prm.add_endRequest оттуда:
Так что ... Просто подумал, что кто-то хотел бы знать, что это работает.
источник
Обновитесь до jQuery 1.3 и используйте:
Примечание: live работает с большинством событий, но не со всеми. Полный список в документации .
источник
live()
метода в IE7 (проект jQuery 1.5.1 / VS2010). При использованииlive()
внутри UpdatePanel в v3.5 ASP.NET регулярныеAutoPostback
из<asp:DropDownList />
причин 2 частичные постбэк в отличие от ожидаемого 1. Дополнительного постбэка выданной браузер испытывает недостаток контента (прерванный) заставляяPage.IsPostBack
бытьfalse
(что убивает состояние внутри моей границы контроль). Я обнаружил, что виновником является метод live (). Я понимаю, что 1-й постбэк должен быть прерван UpdatePanel по спецификации, но только если в очереди есть еще один, которого нет.Вы также можете попробовать:
, поскольку pageLoad () является ajax-событием ASP.NET, которое выполняется каждый раз, когда страница загружается на стороне клиента.
источник
Мой ответ?
и т.п.
Работал как шарм, где ряд других решений с треском провалились.
источник
Я бы использовал один из следующих подходов:
Инкапсулируйте привязку события в функцию и запускайте ее каждый раз, когда вы обновляете страницу. Вы всегда можете содержать привязку события к конкретным элементам, чтобы не связывать события несколько раз с одними и теми же элементами.
Используйте плагин livequery , который автоматически выполняет первый способ для вас. Ваше предпочтение может варьироваться в зависимости от степени контроля, который вы хотите иметь для привязки события.
источник
Это сработало для меня:
источник
Функция pageLoad () очень опасна для использования в этой ситуации. Вы можете сделать события проводными несколько раз. Я бы также держался подальше от .live (), так как он присоединяется к элементу документа и должен пересекать всю страницу (медленно и дрянно).
Лучшее решение, которое я видел до сих пор, - это использовать функцию jQuery .delegate () на оболочке за пределами панели обновления и использовать всплывающие окна. Кроме того, вы всегда можете подключить обработчики, используя библиотеку Microsoft Ajax, которая была разработана для работы с UpdatePanels.
источник
Когда
$(document).ready(function (){...})
не работает после пост страницы назад, используйте функцию JavaScript pageLoad в Asp.page следующим образом:источник
У меня была похожая проблема, и я нашел способ, который работал лучше всего, - это использовать Event Bubbling и делегирование событий для ее решения. Хорошая вещь о делегировании событий заключается в том, что после настройки вам не нужно перепривязывать события после обновления AJAX.
В моем коде я настраиваю делегата на родительском элементе панели обновлений. Этот родительский элемент не заменяется при обновлении, и, следовательно, привязка события не затрагивается.
Существует множество хороших статей и плагинов для обработки делегирования событий в jQuery, и эта функция, вероятно, будет включена в версию 1.3. Статья / плагин, который я использую для справки:
http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery
Как только вы поймете, что происходит, я думаю, что вы найдете это гораздо более элегантное решение, которое будет более надежным, чем повторное связывание событий после каждого обновления. Это также дает дополнительное преимущество, так как дает вам одно событие для отмены привязки, когда страница выгружается.
источник
FWIW, у меня возникла похожая проблема с MooTools. Повторное присоединение моих событий было правильным ходом, но это нужно было сделать в конце запроса .. например
Просто что-то нужно иметь в виду, если beginRequest заставляет вас получать исключения JS с нулевой ссылкой.
ура
источник
Это отличный плагин для использования с панелями обновления:
http://updatepanelplugin.codeplex.com/
источник
Функция pageLoad идеально подходит для этого случая, так как она запускается при начальной загрузке страницы и каждой асинхронной обратной передаче панели обновления. Мне просто нужно было добавить метод unbind, чтобы jquery работал с постбэками updatepanel.
http://encosia.com/document-ready-and-pageload-are-not-the-same/
источник
Мой ответ основан на всех комментариях экспертов, приведенных выше, но ниже приведен следующий код, который любой может использовать, чтобы убедиться, что при каждой обратной передаче и при каждой асинхронной обратной передаче все еще будет выполняться код JavaScript.
В моем случае у меня был пользовательский элемент управления на странице. Просто вставьте приведенный ниже код в свой пользовательский элемент управления.
источник
Панель обновления всегда заменяет ваш Jquery встроенными скриптами Scriptmanager после каждой загрузки. Лучше, если вы используете методы экземпляра pageRequestManager, как это ...
это будет работать нормально ...
источник
Используйте скрипт ниже и измените тело скрипта соответственно.
источник
В ответ на ответ Брайана Маккея:
Я вставляю JavaScript в свою страницу через ScriptManager вместо того, чтобы помещать его прямо в HTML-код UserControl. В моем случае мне нужно перейти к форме, которая станет видимой после того, как UpdatePanel завершит работу и вернется. Это идет в коде файла. В моем примере я уже создал переменную prm на главной странице содержимого.
источник
источник