اذهب إلى المحتوى
  • 0

معالجة مشكل حذف عنصر إلا بعد تحديث الصفحة (لغة الجافاسكريبت)

محمود_سعداوي

السؤال

قمت بإنشاء popup تحتوي على المنتوجات المفضلة.

يتم جلب هذه المصفوفات من مصفوفة من localStorage.

المشكلة التي واجهتي هو عند الضغط على dislike يقع حذف العنصر لكن عند الضغط ثانية لا يقع الحذف إلا بعد تحديث الصفحة.

الكود:

// show my favorite products
const favorites = document.querySelector(".favorite-products")

favorites.addEventListener('click', ()=>{
    // get liked products from localStorage
    favoriteItems = JSON.parse(localStorage.getItem('favoriteProducts'))

    if(favoriteItems.length != 0){
        // create a popup
        let overlay = document.createElement('div')
        overlay.setAttribute("class", "popup-overlay")
        document.body.appendChild(overlay)
    
        //  styling and draw the popup-overlay
        let favoriteWrapper = document.createElement('div')
        favoriteWrapper.setAttribute("class", "favorite-wrapper")
        overlay.appendChild(favoriteWrapper)

        function drawFavoriteProducts(favorites) {
            let drawFavoriteProducts = favorites.map(favItem => {
                return `
                    <i class="fa-sharp fa-solid fa-circle-xmark closeBtn"></i>
                    <div class="favorite-card">   
                        <p class="dislike" data-click="${favItem.id}">
                            Dislike
                            <i class="fa-regular fa-thumbs-down"></i>
                        </p>
                        <img src="${favItem.img_url}.png" alt="" srcset="">
                        
                        <h2 class="favorite-title">${favItem.title}</h2>
                    </div>
                `
            })
            favoriteWrapper.innerHTML = drawFavoriteProducts.join("")
        }
        drawFavoriteProducts(favoriteItems)

        // remove disliked products
        let disliked = document.querySelectorAll('.dislike')
        disliked.forEach(item =>{
            let dislikeId = item.getAttribute("data-click")
            item.addEventListener('click', ()=>{
                favoriteItems = favoriteItems.filter((data) => data.id != dislikeId)
                localStorage.setItem("favoriteProducts", JSON.stringify(favoriteItems))
                drawFavoriteProducts(favoriteItems)
            })
        })
    }
})

// close popup
document.addEventListener('click', function(e){
    // console.log(e.target.className == "fa-sharp fa-solid fa-circle-xmark closeBtn");
    if (e.target.className == "fa-sharp fa-solid fa-circle-xmark closeBtn") {
        e.target.parentNode.remove()
        document.querySelector('.popup-overlay').remove()
    }
})

يمكنكم الإطلاع على الكود كاملا من خلال الرابط التالي:

https://github.com/Saadaoui-Forkan/Ecommerce-website

شكرا على المساعدة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

المشكلة هي أنك في نهاية ال dislike الأول تقوم بإعادة إنشاء عناصر HTML من أجل favoriteItems عن طريق الوظيفة drawFavoriteProducts لكن لا تقوم بإعادة إسناد حدث الـ dislike لتلك العناصر، لحل المشكلة يمكنك التعديل على الكود بالشكل التالي:

favorites.addEventListener('click', ()=>{
    // get liked products from localStorage
    favoriteItems = JSON.parse(localStorage.getItem('favoriteProducts'))

    if(favoriteItems.length != 0){
          // create a popup
          let overlay = document.createElement("div");
          overlay.setAttribute("class", "popup-overlay");
          document.body.appendChild(overlay);

          //  styling and draw the popup-overlay
          let favoriteWrapper = document.createElement("div");
          favoriteWrapper.setAttribute("class", "favorite-wrapper");
          overlay.appendChild(favoriteWrapper);

          function drawFavoriteProducts(favorites) {
                let drawFavoriteProducts = favorites.map((favItem) => {
                      return `
                    <i class="fa-sharp fa-solid fa-circle-xmark closeBtn"></i>
                    <div class="favorite-card">   
                        <p class="dislike" data-click="${favItem.id}">
                            Dislike
                            <i class="fa-regular fa-thumbs-down"></i>
                        </p>
                        <img src="${favItem.img_url}.png" alt="" srcset="">
                        
                        <h2 class="favorite-title">${favItem.title}</h2>
                    </div>
                `;
                });
                favoriteWrapper.innerHTML = drawFavoriteProducts.join("");
				// أسندنا هنا قابلية إزالة الإعجاب إلى العناصر
                ablityToDislike();
          }
          drawFavoriteProducts(favoriteItems);

          // remove disliked products
			//ablityToDislike وضعت هنا وظيفة إسناد الأحداث ضمن طريقة سميتها
          function ablityToDislike() {
                let disliked = document.querySelectorAll(".dislike");
                disliked.forEach((item) => {
                      let dislikeId = item.getAttribute("data-click");
                      item.addEventListener("click", () => {
                            favoriteItems = favoriteItems.filter((data) => data.id != dislikeId);
                            localStorage.setItem("favoriteProducts", JSON.stringify(favoriteItems));
                            drawFavoriteProducts(favoriteItems);
                      });
                });
          }
    }
})

هذا سيحل المشكلة، بالتوفيق إن شاء الله.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...