Выполнить действие над элементами, добавленными AJAX

#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. Кроме того, мне не нужно делать это во многих местах.