Невозможно определить элементы после ajax-вставки
Есть данные в Django DB, при загрузке html страницы она посылает запрос к db и создает html блок в Django шаблоне, а в конце вставляет в html по id. Эта часть работает, чекбоксы создаются и все хорошо, но элементов нет, если я пытаюсь найти их по id после ajax вставки.
Как получить к ним доступ?
html:
<div id="fill-statuses" status-table-url="{% url 'ajax_status_data' %}"></div>
Шаблон Django:
{% for status in statuses %}
<label class="toggle">
<input class="toggle__input" type="checkbox" id="{{ status.status_new }}_status_check_box">
<span class="toggle__label">
<span class="toggle__text">{{ status.status_new }}</span>
</span>
</label>
{% endfor %}
view.py:
def fill_status_check_boxes(request):
statuses = TaskStatus.objects.values('status_new').distinct
return render(request, 'persons/statuses_for_filter.html', {'statuses': statuses})
А теперь js блок, с комментариями:
function fill_status_check_boxes() {
const url = $("#fill-statuses").attr('status-table-url')
$.ajax({
url: url,
success: function (data) {
$('#fill-statuses').html(data)
},
complete: function () {
console.log(document.querySelectorAll("[id*='status_check_box']")) //return array with elements, that's why I thought that all works, when tested it
}
})
console.log(document.querySelectorAll("[id*='status_check_box']")) //but here return empty array []
}
fill_status_check_boxes()
console.log(document.querySelectorAll("[id*='status_check_box']")) //and here also return empty array []
$.ajax()
выполняется асинхронно
Поэтому ваши console.log
внутри обратного вызова complete
отображают то, что вы ожидаете, а не то, что после вызова ajax.
Вы можете создать новую функцию для вызова при завершении :
function fill_status_check_boxes() {
const url = $("#fill-statuses").attr('status-table-url')
$.ajax({
url: url,
success: function (data) {
$('#fill-statuses').html(data)
},
complete: handleComplete
})
}
fill_status_check_boxes()
function handleComplete() {
// Do some stuffs
console.log(document.querySelectorAll("[id*='status_check_box']"))
}