我有这个多选复选框的方案,我需要p.label来触发.item复选框(它的子复选框);

但我的JS脚本只有在单击.labels个时才能工作,它选中/取消选中复选框,但输入when I click directly on the checkboxes个,我需要复选框具有复选框的正常行为,并忽略添加到所有标签的onclick事件.

In short:我需要列表中的项目可以通过标签或直接在框中 Select .我如何修复我的脚本以防止正在发生的碰撞?

let fruits_labels = document.querySelectorAll("#fruits .label");
let fruits_items = document.querySelectorAll("#fruits .label .item"); 

fruits_labels.forEach((label, index) => {

  label.onclick = (event) => {

    console.log("index: " + index);

    fruits_items[index].checked = (fruits_items[index].checked == true) ? false : true;

  }

});

let colors_labels = document.querySelectorAll("#colors .label");
let colors_items = document.querySelectorAll("#colors .label .item");

colors_labels.forEach((label, index) => {

  label.onclick = (event) => {

    console.log("index: " + index);

    colors_items[index].checked = (colors_items[index].checked == true) ? false : true;

  }

});
div.container{ margin: 0; padding: 0; margin-bottom: 10px; width: 200px; border: 1px solid black; }

div.container p.label { margin: 0; padding: 4px 8px; display: flex; align-items: center; border: 1px solid magenta; }

div.container p.label:hover { background-color: yellow; }

div.container p.label input[type=checkbox].item{ margin-right: 6px; }
<div class="container" id="fruits">
  <p class="label"><input class="item" type="checkbox">APPLE</p>
  <p class="label"><input class="item" type="checkbox">BANANA</p>
  <p class="label"><input class="item" type="checkbox">KIWI</p>
  <p class="label"><input class="item" type="checkbox">LEMON</p>
  <p class="label"><input class="item" type="checkbox">ORANGE</p>
</div>

<div class="container" id="colors">
  <p class="label"><input class="item" type="checkbox">RED</p>
  <p class="label"><input class="item" type="checkbox">GREEN</p>
  <p class="label"><input class="item" type="checkbox">BLUE</p>
</div>

推荐答案

虽然您可以使用标签并且它们会很好地工作,但正如Ostone0所描述的那样,我将向您展示如何修复您的脚本,这样您将了解传播和stopPropagation,但是您不应该使自己过于复杂,您的目标应该是在测试成功后简化您的代码.

let fruits_labels = document.querySelectorAll("#fruits .label");
let fruits_items = document.querySelectorAll("#fruits .label .item"); 

fruits_labels.forEach((label, index) => {

  label.onclick = (event) => {

    console.log("index: " + index);

    fruits_items[index].checked = (fruits_items[index].checked == true) ? false : true;

  }
  
  label.querySelector('input[type=checkbox]').addEventListener("click", function(event) {
      console.log("index: " + index);
      event.stopPropagation();
  });

});

let colors_labels = document.querySelectorAll("#colors .label");
let colors_items = document.querySelectorAll("#colors .label .item");

colors_labels.forEach((label, index) => {

  label.onclick = (event) => {

    console.log("index: " + index);

    colors_items[index].checked = (colors_items[index].checked == true) ? false : true;

  }

  label.querySelector('input[type=checkbox]').addEventListener("click", function(event) {
      console.log("index: " + index);
      event.stopPropagation();
  });
});
div.container{ margin: 0; padding: 0; margin-bottom: 10px; width: 200px; border: 1px solid black; }

div.container p.label { margin: 0; padding: 4px 8px; display: flex; align-items: center; border: 1px solid magenta; }

div.container p.label:hover { background-color: yellow; }

div.container p.label input[type=checkbox].item{ margin-right: 6px; }
<div class="container" id="fruits">
  <p class="label"><input class="item" type="checkbox">APPLE</p>
  <p class="label"><input class="item" type="checkbox">BANANA</p>
  <p class="label"><input class="item" type="checkbox">KIWI</p>
  <p class="label"><input class="item" type="checkbox">LEMON</p>
  <p class="label"><input class="item" type="checkbox">ORANGE</p>
</div>

<div class="container" id="colors">
  <p class="label"><input class="item" type="checkbox">RED</p>
  <p class="label"><input class="item" type="checkbox">GREEN</p>
  <p class="label"><input class="item" type="checkbox">BLUE</p>
</div>

事件是冒泡的,即,标签propagates的事件、将一个传播到其父的父的事件等等.因此,当您单击该复选框时,其默认的单击处理程序会更改checked值并传播到父对象,该父对象具有一个取反checked值的事件.因此,您可以使用stopPropagation来避免气泡的发生.

Javascript相关问答推荐

如何将特定的字符串类型转换为TypScript中的字符串?

Node.JS ws包中是否有Webocket的错误代码列表?

我无法使用tailwind-css和reactJS修改图像的位置

将未等待的未处理的错误promise 转变为警告@ changeTicksAndRejections(由当时的抛出错误创建)

为什么我无法使用useMemo()停止脚本渲染?

无法在page. evalve()内部使用外部函数

为什么在集内和集外会产生不同的promise 状态(使用Promise.race)?

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

Express.js:使用Passport.js实现基于角色的身份验证时出现太多重定向问题

在JavaScript中检索一些文本

使用print This时, map 容器已在LeafletJS中初始化

如何修复循环HTML元素附加函数中的问题?

D3多线图显示1线而不是3线

我不知道为什么setwritten包装promise 不能像我预期的那样工作

如何解决useState错误—setSelect Image不是函数''

使用原型判断对象是否为类的实例

在forEach循环中获取目标而不是父对象的属性

将多个文本框中的输出合并到一个文本框中

使用Reaction窗体挂钩注册日历组件

JavaScript将字符串数字转换为整数