簡體   English   中英

Javascript 事件監聽器需要點擊兩次,這樣 function 才能工作

[英]Javascript eventlistener need to click twice so function will work

因此,當我單擊“hartje”部分時,我觸發了 function。 function 正在獲取名為“food-option”的所有課程。 如果我點擊 function 觸發器,它應該給“數據收藏”一個值。 它確實給了它一個值,但問題是我必須單擊兩次才能得到一個

 const foodOption = document.querySelectorAll(".food-option") function makeFavo() { for (var i = 0; i < foodOption.length; i++) { foodOption[i].addEventListener("click", e => { if (e.path[2].dataset.favorite == "fav") { e.path[2].dataset.favorite = "" e.path[1].children[0].style.backgroundColor = "gray" e.path[1].children[1].style.backgroundColor = "gray" e.path[1].style.backgroundColor = "gray" } else { e.path[2].dataset.favorite = "fav" e.path[1].children[0].style.backgroundColor = "red" e.path[1].children[1].style.backgroundColor = "red" e.path[1].style.backgroundColor = "red" } }) } }
 <section data-favorite="" class="food-option"> <section class="food-picture"> <figure> <img class="picture" src="./Images/vegetarisch-recept-flatbreads-met-falafel-yoghurt-muntsaus2-1585741275.jpg" alt=""> </figure> </section> <section class="food-choice"> <p>falafel</p> </section> <section class="favo-food"> <section class="hartje" onclick="makeFavo()"> <section class="hartje2"> </section> <section class="hartje3"> </section> </section> </section>

這是因為需要兩個事件來觸發添加數據屬性的事件監聽器。

單擊 1 您所做的就是將事件偵聽器添加到每個食物選項部分。

單擊 2,然后您將觸發您剛剛添加的添加數據屬性的事件。

只需刪除 function makeFavo 和 onclick 觸發器,然后將事件偵聽器添加到食物選項即可。

您的示例代碼的問題在於您將 function makeFavo()附加到 section 元素上的 onclick 事件以及在 ZC1C425268E68385D1AB5074C17A 內部具有 addEventListener 邏輯的方式。

在您的 function 中,有一個用於單擊的addEventListener ,這意味着您每次調用 function 時都在注冊一個的單擊事件偵聽器。 這導致您看到必須單擊兩次才能看到背景顏色的變化,但在內部,如果您仔細觀察,它實際上是在執行多個已注冊的單擊事件。

您可以做的是刪除 onclick 或 addEventListener 以防止您的代碼觸發多個事件。

請參閱下面的示例。 我試圖保留你的大部分代碼:

HTML我在這里刪除了 onclick ......

<section data-favorite="" class="food-option">
<section class="food-picture">
  <figure>
    <img class="picture"
         src="./Images/vegetarisch-recept-flatbreads-met-falafel-yoghurt-muntsaus2-1585741275.jpg"
         alt="">
  </figure>
</section>
<section class="food-choice">
  <p>falafel</p>
</section>
<section class="favo-food">
  <section class="hartje">
    <section class="hartje2">
      2
    </section>
    <section class="hartje3">
      3
    </section>
  </section>
</section>

JavaScript

 // Attach the click listener when DOM is ready.
 document.addEventListener('DOMContentLoaded', (e) => {
  // updated from querySelectorAll to querySelector since there's only 1 element in your HTML for this one.
  const foodOption = document.querySelector(".food-option");
  foodOption.addEventListener("click", e => {
    if (e.path[2].dataset.favorite == "fav") {
      e.path[2].dataset.favorite = ""
      e.path[1].children[0].style.backgroundColor = "gray"
      e.path[1].children[1].style.backgroundColor = "gray"
      e.path[1].style.backgroundColor = "gray"
    } else {
      e.path[2].dataset.favorite = "fav"
      e.path[1].children[0].style.backgroundColor = "red"
      e.path[1].children[1].style.backgroundColor = "red"
      e.path[1].style.backgroundColor = "red"
    }
  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM