Ajax загружает частичное представление — обрабатывает html-элементы при изменении документа

#javascript #jquery #ajax #events

Вопрос:

Я использую приложение MVC, jQuery и Bootstrap 4. Когда пользователь нажимает на кнопку, я загружаю частичное представление, содержащее модальный диалог, и показ выглядит следующим образом:

 function loadModal(url, data)
    $.ajax({ 
        url: url, data: data, type: "GET",
        success: function (data) { showModal(data); },
    });
}   

function showModal(data) {
    var $dialog = $(data);
    $("body").prepend($dialog);
    $dialog.modal({ show: true, keyboard: true, backdrop: 'static'});
}
 

В других случаях иногда я просто заменяю html-часть документа, загруженную:

 function loadPartial(url, data, targetSelector)
    $.ajax({ 
        url: url, data: data, type: "GET",
        success: function (data) { $(targetSelector).html( data ); },
    });
}   
 

Это просто. Работает хорошо.

Моя проблема начинается сейчас: если частичное представление содержит html — элементы с определенными атрибутами-я хочу обработать их следующим образом:

 function siteIsModified($html) {
   $("select.selectpicker", $html).selectpicker();
   $('input[data-autocomplete]', $html).each(setupAutoComplete);
   ...
}
 

К сожалению, наша библиотека JS содержит несколько функций вызова загрузки ajax — я не хочу добавлять вызов siteIsModified(..) ко всем из них. Новые функции могут быть разработаны позже — и могут забыть вызвать эту функцию.

Я вызываю эту функцию в функции готовности документа, но это нормально, они не будут выполняться в более позднем загруженном частичном html-коде. Однако будет прикреплено следующее событие щелчка ajaxtab:

 $(document).ready(function () {
  $(document).on("click", '[data-on-click-toggle="ajaxTab"]', onClickAjaxTab);
  siteIsModified($(body));
  ...
}
 

Как я могу написать такой код, который будет вызываться автоматически при изменении документа (и это решение не будет зависеть от $.ajax, поскольку мы заменяем его для извлечения)? Или я могу написать эти строки обработки, как в документе на:

 // I am afraid it wont executes on the ajax loaded parts - or good as general
$(document).on("load","select.selectpicker", function() {$(this).selectpicker();})
 

Я думаю, что вызов этой функции siteIsModified() не подходит для частичного представления, так как я думаю, что она выполняется до добавления html-части в DOM и не может обрабатываться самостоятельно. И что еще более важно: это не элегантное решение-добавлять этот фрагмент JS в каждое частичное представление в конце 🙁

 <div>... some partial view content goes here...</div>
<script type="text/javascript">siteIsModified(??)</script>