#jquery #jquery-plugins #dynamic #element
#jquery #jquery-плагины #динамический #элемент
Вопрос:
У меня есть страница с лайтбоксом на ней, с использованием плагина lightbox. Элементы, которые я хочу превратить в лайтбокс, просто выбираются и изменяются следующим образом:
$(".lightbox").find("a").live ("щелчок", функция (e) { e.preventDefault(); $(".lightbox").find("a").fancybox({ 'transitionIn': 'эластичный', 'transitionOut': 'эластичный' }); });
Я знаю, что это не самый чистый способ, но пока он работает. Мой реальный вопрос в том, как я могу выполнить $(".lightbox").fancybox(...)
над элементами, добавленными на страницу AJAX? Я мог бы поместить .fancybox()
материал внутрь success:
части вызова AJAX, но я ищу более чистое решение «запустить и забыть»; я могу написать один фрагмент кода, который применим ко всем будущим элементам. .live()
здесь идеально, если не считать того факта, что вы должны привязать его к событию. Я предполагаю, что даже здесь есть create
, которого не существует.
Итак, как я могу запустить функцию для элементов, добавленных на страницу AJAX сейчас или в будущем, без необходимости разбрасывать множество фрагментов кода повсюду?
Спасибо,
Джеймс
Комментарии:
1. я думаю, что обратный вызов ajax может быть одним из вариантов, как вы упомянули, другие дают имя класса и связывают их с помощью live
2. Я не вижу ничего плохого в организации вашего кода «подготовки» таким образом, чтобы его можно было вызывать всякий раз, когда это необходимо, а затем просто выполнять это из обработчиков «успеха» динамических обновлений. Это довольно простая архитектурная проблема для решения: просто рассматривайте время загрузки страницы как просто еще один не специальный пример «подготовить материал к действию».
3. @kobe: Спасибо за это. Я думаю, что я начну с добавления кода в
success:
вызов; Это не слишком сложно, и если я помещу его в функцию, его будет легче редактировать.
Ответ №1:
Просто добавьте еще один уровень абстракции над вашим вызовом jQuery ajax. Этот слой выполнит для вас вызов ajax и просканирует ваш результат, добавив лайтбокс по мере необходимости. Вот что я имею в виду:
1.
function lightBoxAjaxRequest(requestObj) {
if (requestObj.success) {
var requestObjCopy = $.clone(requestObj); // clone request object
requestObjCopy.success = function add$lightbox$to$response(html) {
// Add "html" to the page...
// Call lightbox code here, on newly added HTML
requestObj.success(html); // Trigger original success handler
};
$.ajax(requestObjCopy);
}
else {
$.ajax(requestObj);
}
};
Может быть, что-то вроде этого? Хотя я не знаю, насколько хорошо это сработает на практике. Кажется, что вы хотите всегда запускать какую-то функцию после того, как что-то было добавлено в DOM.
В качестве альтернативы
Вы также можете создать оболочку вокруг innerHTML
, которая выполнит всю работу за вас:
2.
function addHtmlToDomWithLightbox(domElement, html) {
if (typeof domElement === "string") {
domElement = $("#" domElement);
}
domElement.html(html);
// Add lightbox here
domElement.find("a").fancyBox({});
};
Вы бы вызывали addHtmlToDomWithLightbox
все свои функции успеха (вместо добавления html с помощью метода jQuery html
). Обратите внимание, что название метода длинное и подробное, вы можете изменить его и разместить метод где угодно. Я просто сделал это подробным в иллюстративных целях.
Комментарии:
1. Большое спасибо за усилия, которые вы вложили в этот ответ! Я действительно ценю это, однако я выбрал более простой вариант вызова функции при возврате запроса AJAX. Кроме того, мне не нужно делать это во многих местах.