Да, live
и delegate
ваши друзья.
В частности, вы должны попытаться использовать delegate
, потому что события, связанные с live
, всплывают на всем протяжении DOM до того, как их поймают.
Синтаксис для delegate
:
$("#parent_element").delegate(
"#child_selector_event_occurs_on",
"click" // <-- Event to declare a handler for
function() { ... });
На странице связанной документации для delegate
есть несколько примеров.
Edit:
Мой ответ выше предполагает, что вы теряете обработчики событий, связанные с контентом, который заменяется или обновляется с помощью AJAX. Если вам необходимо выполнить такие действия, как повторная инициализация виджетов или запустить другой пользовательский код, вам будет полезно переместить этот код в общую функцию и вызывать ее при успешной загрузке нового содержимого (и в вашем обработчике document.ready
).
Например:
function init() {
/* Write initialization code here */
}
$(document).ready(function() { init(); });
/* Later on, when you reload the content: */
$("#ajaxified").load("foo.html", function() { init(); });
Другой альтернативой является плагин livequery
, который я не использовал, но слышал о хороших вещах. В частности, вы бы посмотрели на функциональность вспомогательной функции:
$('#selector')
.livequery(function(){
/* Write code here to execute when a new element matching the
selector is added. */
init();
});