亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Javascript中檢查多個復選框狀態時如何防止重復代碼?

在Javascript中檢查多個復選框狀態時如何防止重復代碼?

喵喔喔 2022-05-26 17:50:44
我正在制作一種復選框,當“選中”屬性為真或假時顯示圖像。第一個復選框現在可以使用,但我不清楚如何減少所需的代碼量,因為每個復選框基本上都做同樣的事情。我必須顯示圖像的工作功能如下所示:const pepperoniCheckbox = document.getElementById("pepperoniCheckbox");const pepperoniImage = document.getElementById("pepperoni-image");document.getElementById("pepperoniCheckbox").onclick = function() {  if (this.checked) {    pepperoniImage.style.visibility = "visible";  } else {    pepperoniImage.style.visibility = "hidden";  }};圖像和復選框的 HTML 也在這里:<div class="ingredients-boxes" style="padding-top: 200px">  <input type="checkbox" value="pepperoni" id="pepperoniCheckbox" />  <label for="pepperoni"> Pepperoni </label>  <input type="checkbox" value="olives" id="olivesCheckbox" />  <label for="olives"> Olives </label></div><main>  <div class="pizza-holder">    <img class="pizza" src="pizza-hut-crust-pan-pizza-food-delivery-pizza.jpg" />    <img class="pizza pepperoni" id="pepperoni-image" src="pepperoni-transparent.png" />  </div></main>我確信有一種方法可以為我添加的未來復選框和內容復制這種效果,但我無法繞開它。我認為每個復選框都需要有一個 onclick 事件,它們都指向同一個函數,而不是像我上面所做的那樣將函數放在每個復選框變量上。
查看完整描述

3 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

有很多方法可以做到這一點,但一個簡單的方法是:


創建一個 JS 函數,該函數將元素作為選項并使用它來構建 id(假設您保持一致的命名約定):


function isChecked(e) {

  if (e.checked) {

    document.getElementById(e.value + '-image').style.visibility = "visible";

  } else {

    document.getElementById(e.value + '-image').style.visibility = "hidden";

  }

}

然后在您的 HTML 中,onclick為每個元素添加一個:


<input type="checkbox" value="pepperoni" id="pepperoniCheckbox" onclick="isChecked(this);"/>


查看完整回答
反對 回復 2022-05-26
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

回答

您可以將所謂的事件委托與Element.prototype.matches和event.target一起使用。


工作示例:


(注意:我從父 div 中刪除了填充以更好地適應演示)


const parent = document.querySelector(".ingredients-boxes");


parent.addEventListener("click", function(event) {

const element = event.target;


if(element.matches("input[type='checkbox']")) {

const image = document.querySelector("#" + element.value + "-image");

  if (element.checked) {

    image.style.visibility = "visible";

  } else {

    image.style.visibility = "hidden";

  }

}

});

<div class="ingredients-boxes">

  <input type="checkbox" value="pepperoni" id="pepperoniCheckbox" />

  <label for="pepperoni"> Pepperoni </label>


  <input type="checkbox" value="olives" id="olivesCheckbox" />

  <label for="olives"> Olives </label>

</div>

<main>

  <div class="pizza-holder">

    <img class="pizza" src="pizza-hut-crust-pan-pizza-food-delivery-pizza.jpg" />

    <img class="pizza pepperoni" id="pepperoni-image" src="pepperoni-transparent.png" />

    <img class="pizza olives" id="olives-image" src="pepperoni-transparent.png" />

  </div>

</main>


查看完整回答
反對 回復 2022-05-26
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

解釋:

事件委托將事件偵聽器添加到父元素。


此事件偵聽器監視事件。當事件發生時,它會檢查哪些子元素導致了該事件。


活動元素在 中可用event.target。


parent.addEventListener(function(event) {

const element = event.target;


});

我們可以使用Element.prototypematches的方法檢查該元素是否是我們正在尋找的元素


例如,在您的情況下,我們正在尋找checkboxes。


parent.addEventListener(function(event) {

const element = event.target;


if(element.matches("input[type='checkbox']")) {

   // do something

}


});

使用事件委托時的重要一點是,您要為想要操作的項目保持相同的命名約定。


在您的情況下,圖像的ID始終是element.value + "-image"


visibility因此,我們可以在事件監聽器中查找元素并調整它。


const image = document.querySelector("#" + element.value + "-image");

  if (element.checked) {

    image.style.visibility = "visible";

  } else {

    image.style.visibility = "hidden";

  }

}

完整代碼:

const parent = document.querySelector(".ingredients-boxes");


parent.addEventListener("click", function(event) {

const element = event.target;


if(element.matches("input[type='checkbox']")) {

const image = document.querySelector("#" + element.value + "-image");

  if (element.checked) {

    image.style.visibility = "visible";

  } else {

    image.style.visibility = "hidden";

  }

}

});

建議:

給你所有的頂級圖像一個類,以便它們加載hidden。

緩存圖像元素,這樣您就不必每次單擊復選框時都搜索 DOM。

頂級課程 - 最初隱藏的示例:


const parent = document.querySelector(".ingredients-boxes");


parent.addEventListener("click", function(event) {

const element = event.target;


if(element.matches("input[type='checkbox']")) {

const image = document.querySelector("#" + element.value + "-image");

  if (element.checked) {

    image.style.visibility = "visible";

  } else {

    image.style.visibility = "hidden";

  }

}

});

.topping {

 visibility: hidden;

}

<div class="ingredients-boxes">

  <input type="checkbox" value="pepperoni" id="pepperoniCheckbox" />

  <label for="pepperoni"> Pepperoni </label>


  <input type="checkbox" value="olives" id="olivesCheckbox" />

  <label for="olives"> Olives </label>

</div>

<main>

  <div class="pizza-holder">

    <img class="pizza" src="pizza-hut-crust-pan-pizza-food-delivery-pizza.jpg" />

    <img class="pizza pepperoni topping" id="pepperoni-image" src="pepperoni-transparent.png" />

    <img class="pizza olives topping" id="olives-image" src="pepperoni-transparent.png" />

  </div>

</main>


緩存示例:


const parent = document.querySelector(".ingredients-boxes");


parent.addEventListener("click", function(event) {

if(!this.cache) {

 this.cache = {};

}


const element = event.target;


if(element.matches("input[type='checkbox']")) {

const topping = element.value;

let image = this.cache[topping];


if(!image) {

 image = 

 this.cache[topping] = 

 document.querySelector("#" + element.value + "-image");

}


  if (element.checked) {

    image.style.visibility = "visible";

  } else {

    image.style.visibility = "hidden";

  }


}

});

.topping {

 visibility: hidden;

}

<div class="ingredients-boxes">

  <input type="checkbox" value="pepperoni" id="pepperoniCheckbox" />

  <label for="pepperoni"> Pepperoni </label>


  <input type="checkbox" value="olives" id="olivesCheckbox" />

  <label for="olives"> Olives </label>

</div>

<main>

  <div class="pizza-holder">

    <img class="pizza" src="pizza-hut-crust-pan-pizza-food-delivery-pizza.jpg" />

    <img class="pizza pepperoni topping" id="pepperoni-image" src="pepperoni-transparent.png" />

    <img class="pizza olives topping" id="olives-image" src="pepperoni-transparent.png" />

  </div>

</main>


查看完整回答
反對 回復 2022-05-26
  • 3 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號