У меня есть список категорий поставщиков и поставщиков, загружаемых с помощью ajax на странице, и я добавил флажок рядом с каждым из них.
When the ajax call is done, я добавляю EventListener для каждого флажка, чтобы иметь дело с отмеченным / снятым флажком.
Я вызываю get_dispos_fournisseurs when I checked/unchecked a category, потому что мне нужно перезагрузить провайдеров.
Проблема в том, что мой javascript не всегда вызывается. Это потому, что мой ajax на самом деле не работает, или потому, что он асинхронный? Если да, то как я могу это исправить?
Заранее спасибо :)
xhrLoad_panneau = $.ajax({
type: "post",
url: path_to_load_panneau,
data: "contexte = " + contexte ,
success: function () {
for (var i in fournisseurs) {
$(bloc_fournisseur).append("<input id='"+fournisseurs[i][15]+"' class='progi' categorie='" + fournisseurs[i][11] +"' distance='"+ distance_text +"' provider_name='"+fournisseurs[i][2]+"' name='fournisseur' type='checkbox' />");
$(bloc_fournisseur).append("<img class='progi-img' src='/assets/progi/calendrier.png' alt='progi' />");
}).always(function(){
get_dispos_fournisseurs();
});
function get_dispos_fournisseurs(){
var myFunction = function (event) {
document.getElementById("btn-dispos").disabled = ($("input[name='fournisseur']:checked").length < 1) ? true : false;
if ($("input[name='fournisseur']:checked").length > 5) {
this.checked = false;
} else {
if (this.checked) {
ids[this.id] = [this.getAttribute('provider_name'), this.getAttribute('distance')];
} else {
delete ids[this.id];
}
}
};
var checkboxes = document.getElementsByClassName('progi');
for (i = 0; i < checkboxes.length; i++){
checkboxes[i].removeEventListener("change", myFunction, false);
checkboxes[i].addEventListener('change', myFunction, false);
}
}
@Doug похоже, что myFunction вызывается только в своей лексической области видимости из того, что я вижу. Где вы видите, что это называется вне сферы действия?
@Doug Я пробовал, но ничего не меняет. Я добавил некоторые детали к своему вопросу, если это может вам помочь.
@dgeare Я начал свой комментарий со слов «моя лучшая догадка», потому что это все, что у меня было :) Мне было любопытно, поможет ли продвижение области действия функции для событий изменения устранить ошибку
@ NoémieHarvey, вы можете попробовать добавить несколько сообщений console.info () в случае успеха и всегда (возможно, даже get_dispos_fournissuers), чтобы увидеть, когда и как часто каждое из них вызывается
@ NoémieHarvey где определяется fournisseurs?
@dgeare fournisseurs определен в файле js, почему?
@ NoémieHarvey было любопытно, был ли он загружен асинхронно и, возможно, undefined (или пустым) в то время, когда происходит цикл for
Кроме того, вам кажется, что вам не хватает закрывающего } в этом цикле for из того, что я вижу
@dgeare проблема действительно связана с событием change, которое не всегда вызывается флажками.
если они не работают должным образом, можете ли вы проверить прикрепленные прослушиватели событий в chrome devtools и убедиться, что к событию изменения привязано 0 слушателей?
Я обнаружил одну ошибку: removeEventListener на самом деле ничего не делает, поскольку вы переопределяете myFunction при каждом вызове функции. Попробуйте переместить myFunction за пределы функции и посмотрите, исправит ли это что-нибудь.
@dgeare Я отлаживал в консоли, когда я зацикливаю свои флажки, добавляется прослушиватель событий "изменение". но когда я устанавливаю флажок, ничего не происходит (некоторые работают, другие нет, так что это действительно сбивает с толку) ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


я предполагаю, что у кода возникают проблемы с поиском
myFunction(), поскольку он вложен вget_dispos_fournisseurs()- можете ли вы попробовать переместитьmyFunction()в глобальную область видимости?