Почему я могу удалить только последний элемент моего ЛОКАЛЬНОГО ХРАНИЛИЩА с помощью .FILTER

Я не понимаю, почему я могу удалить только последний ЭЛЕМЕНТ моего списка камер

Я могу удалить последний, и даже если он работает, я получаю сообщение об ошибке:

Uncaught (in promise) TypeError: Cannot read property 'innerHTML' of null
    at panier.js:43
    at Array.forEach (<anonymous>)
    at displayBasket (panier.js:42)

поэтому, если удалить последний и обновить, я получил свои 2 камеры (с ошибкой, не могу прочитать). Если я снова удалю последнюю, обновлю и получу последнюю камеру (все еще с ошибкой Cannot Read)

но если я нажимаю SUPPRIMER (удалить на английском языке) только с 1 элементом в моей таблице, он работает без ошибок.

я пытался понять, но я не понимаю.

Помогите пожалуйста :р

async function displayBasket() {
    const cameraIds = getCameraIds();

    const basket = document.getElementById("panier");

    if (cameraIds.length === 0) {
        basket.innerHTML = `<p>Votre panier est vide</p>`
    } else {
        const promises = [];

        cameraIds.forEach(cameraId => {
            promises.push(getCameraDetails(cameraId))
        })

        const allCameraDetails = await Promise.all(promises);
        const basketTable = document.getElementById("basketTable");
        console.info('allCameraDetails', allCameraDetails)
        allCameraDetails.forEach((cameraDetails, index) => {
            basketTable.innerHTML += `
            <tr>
                <td><img id = "imageProduct" src = "${cameraDetails.imageUrl}"></td>
                <td id = "descriptionProduct">${cameraDetails.name}</td>
                <td id = "priceProduct">${(cameraDetails.price / 100).toFixed(2)}</td>
                <td><button id = "button-${index}">Supprimer</button></td>
            </td>
            </tr>
            `
            buttonProduct = document.getElementById(`button-${index}`);
            buttonProduct.addEventListener('click', () => {
                const storageCameras = JSON.parse(localStorage.getItem('basketCameras'));
                const newStorageCameras = storageCameras.filter(currentCameraId => { return currentCameraId !== cameraDetails._id })
                localStorage.setItem('basketCameras', JSON.stringify(newStorageCameras));

                basket.innerHTML = ``;
                displayBasket();
            })

        });
    }
}

( смотреть скриншот )

у вас есть элементы корзины и корзины в вашей DOM?

AlexZvl 13.12.2020 18:23

Вы также можете вставить HTML?

AlexZvl 13.12.2020 18:24

Это потому, что вы изменяете html корзины, поэтому он каждый раз теряет прослушиватель событий кнопки.

ptothep 13.12.2020 18:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
190
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте обновить прослушиватели событий после изменения html.

        allCameraDetails.forEach((cameraDetails, index) => {
            basketTable.innerHTML += `
            <tr>
                <td><img id = "imageProduct" src = "${cameraDetails.imageUrl}"></td>
                <td id = "descriptionProduct">${cameraDetails.name}</td>
                <td id = "priceProduct">${(cameraDetails.price / 100).toFixed(2)}</td>
                <td><button id = "button-${index}">Supprimer</button></td>
            </td>
            </tr>
            `})
            allCameraDetails.forEach((_, index) => {
            buttonProduct = document.getElementById(`button-${index}`);
            buttonProduct.addEventListener('click', () => {
                const storageCameras = JSON.parse(localStorage.getItem('basketCameras'));
                const newStorageCameras = storageCameras.filter(currentCameraId => { return                           currentCameraId !== cameraDetails._id })
                localStorage.setItem('basketCameras', JSON.stringify(newStorageCameras));

                basket.innerHTML = ``;
                displayBasket();
            })
            })

        

Если вы удаляете определенный элемент из хранилища и исчезает только последний, это происходит потому, что ваш код не находит этот конкретный элемент, поэтому он удаляет последний.

Пытаться:

  • Проверяйте данные при нажатии на кнопку удаления, чтобы знать, какие данные получает ваш код.
  • Если данные должны быть правильными, проверьте значение функции фильтра. Вероятно, не соответствует каким-либо сохраненным данным.
  • Поскольку вы изменяете HTML, рассмотрите также ответ ptothep.
  • Я также рекомендую использовать createElement и appendChild вместо описания innerHTML, так как это менее удобно писать, но более гибко в долгосрочной перспективе. Просто рассказываю как альтернативу...

Другие вопросы по теме