Bonjour à tous,
Dans le code ci-dessous qui marche, je cherche à obtenir les nouvelles positions de chaque élément de la liste pour pouvoir actualiser la bdd, or , malgré que les éléments soient bien déplacés, impossible d'accéder à leur nouvel index, c'est toujours l'ancien index qui est renvoyé ...
J'ai essayé de capter le nouvel index après le drop et le dragend, rien ne change, c'est toujours l'index à l'ouverture de page qui est renvoyé malgré un nouvel querySelector.
D'autre part, la fonction actualiserNumerotation() n'a pas non plus l'effet escompté.
Je suppose qu'il faut utiliser un autre eventListener pour capter les derniers changements dans le DOM mais lequel ?
Merci de votre aide
const sortableList = document.querySelector(".sortable-list");
let items = document.querySelectorAll(".item");
let listItems = Array.from(items);
const numerotationListe = document.querySelectorAll(".numerotation-item");
items.forEach((item) => {
item.addEventListener("dragstart", () => {
//Ajout de la classe "dragging" après délai
setTimeout(() => item.classList.add("dragging"), 0);
});
item.addEventListener("dragend", () => {
//Annulation de la classe "dragging"
item.classList.remove("dragging");
//Actualiser la numérotation
actualiserNumerotation();
//Création du tableau de positions des items dans la liste
listItems.forEach((item) => {
let itemId = item.dataset.id;
let position = listItems.indexOf(item);
// console.log("Position : ", position, "id : ", itemId);
});
});
});
const initSortableList = (e) => {
e.preventDefault();
const draggingItem = sortableList.querySelector(".dragging");
//Récupérer tous les items exceptés ceux en mouvement
let siblings = [...sortableList.querySelectorAll(".item:not(.dragging)")];
//Recherche l'élément après lequel l'élément déplacé doit être placé
let nextSibling = siblings.find((sibling) => {
return e.clientY <= sibling.offsetTop + sibling.offsetHeight / 2;
});
//Insertion de l'item à la nouvelle place
sortableList.insertBefore(draggingItem, nextSibling);
};
sortableList.addEventListener("dragover", initSortableList);
sortableList.addEventListener("dragenter", (e) => e.preventDefault());
//actualiser numérotation de liste
const actualiserNumerotation = () => {
for (let i = 0; i < numerotationListe.length; i++) {
numerotationListe[i].textContent = i + 1;
}
console.log("succès numérotation");
};
D'autre part,faut-il mettre en place un setTimeOut pour éviter les requêtes trop fréquentes au serveur ?