Обработчик клика на динамически добавленные элементы через делегирование с контейнера
Разбор задачи
Вместо прямых addEventListener на каждую карточку после appendChild подписывают родительский элемент и фильтруют target через Element.closest по data-атрибуту.
document.getElementById('news-roll').addEventListener('click', (ev) => {
const trigger = ev.target.closest('[data-action="open-sheet"]');
if (!trigger || !ev.currentTarget.contains(trigger)) return;
ev.preventDefault();
BX.ajax.runComponentAction(/* namespace */, 'preview', {
mode: 'class',
data: { id: Number(trigger.dataset.id) },
}).then((reply) => {
BX.UI.Notification.Center.notify({ content: reply.data.snippetHtml });
});
});Любые прямые вызовы BX.ajax.* параметризуйте CSRF там, где требует ядро, и не смешивайте с синхронным innerHTML пользовательским вводом.
Замечания перед выкладкой
Вносите правки только через среду с бэкапом и понятным diff. Если сниппет идёт в шаблон на Битрикс, проверьте конфликт с уже подключённым jQuery/UI и включите «отложенный» запуск там, где длинный главный файл может обрезать DOMContentLoaded.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии