Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将侦听器更改为多个复选框元素的querySelectorAll

将侦听器更改为多个复选框元素的querySelectorAll
EN

Stack Overflow用户
提问于 2020-02-07 07:56:20
回答 3查看 498关注 0票数 0

我正在尝试向复选框列表中添加一个事件onchange,这样当选中标签文本时,标签文本就会划出。我似乎搞不清我做错了什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let todoItem = document.querySelectorAll('.container');
let checkItem = document.querySelectorAll('.checkItem');

for (let i = 0; i < checkItem.length; i += 1) {
  for (let k = 0; k < todoItem.length; k += 1) {
    checkItem[i].onchange = () => {
      if (checkItem[i].checked === true) {
        todoItem[k].style.textDecoration = 'line-through';
      } else {
        todoItem[k].style.textDecoration = 'none';
      }
    }
  }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  <label class="container">one
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">two
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">three
  <input type="checkbox" class="checkItem">
 </label>
</div>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-07 08:09:43

所以,这里发生了几件事。首先,您正在运行两个循环,基本上是这样的:对于每个复选框,设置它的侦听器来切换label 1。然后将它的侦听器设置为label 2。然后是label 3。其次,通过赋值checkItem[i].onchange = [Fn],您将覆盖它以前的任何值,这就是为什么您只看到最后一个标签被切换而不是全部三个。从本质上说,循环的结果如下所示:

  1. 设置复选框1的侦听器切换标签1。
  2. 设置复选框1的监听器切换标签2,覆盖先前的侦听器;
  3. 将复选框1的监听器设置为切换标签3,覆盖以前的侦听器。
  4. 设置复选框2的监听器切换标签1。

<代码>H 110设置复选框2的监听器切换标签2,覆盖其上一个

  1. 复选框2的监听器切换标签3。重写前一个listener.
  2. Set复选框3的监听器以切换标签1。
  3. 将复选框3的监听器设置为切换标签2,重写以前的listener.
  4. Set复选框3的监听器以切换标签3,覆盖以前的侦听器。

删除内部循环并重用相同的索引将解决您的问题。但是,我建议更进一步,使用addEventListener实际分配事件侦听器。这样,将来可以在不干扰现有功能的情况下添加额外的侦听器。下面的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let todoItem = document.querySelectorAll('.container');
let checkItem = document.querySelectorAll('.checkItem');

for (let i = 0; i < checkItem.length; i += 1) {
  checkItem[i].addEventListener('change', () => {
    if (checkItem[i].checked === true) {
      todoItem[i].style.textDecoration = 'line-through';
    } else {
      todoItem[i].style.textDecoration = 'none';
    }
  });
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  <label class="container">one
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">two
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">three
  <input type="checkbox" class="checkItem">
 </label>
</div>

票数 1
EN

Stack Overflow用户

发布于 2020-02-07 08:01:47

您的内环是问题所在,您将所有标签迭代到最后一个标签,并将其作为onchange事件应用于每个复选框,因此最后一个标签总是会通过它,无论选中哪个复选框,因为有与复选框完全相同的标签数量,所以去掉内环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let todoItem = document.querySelectorAll('.container');
let checkItem = document.querySelectorAll('.checkItem');

for (let i = 0; i < checkItem.length; i += 1) {
    checkItem[i].onchange = () => {
      if (checkItem[i].checked === true) {
        todoItem[i].style.textDecoration = 'line-through';
      } else {
        todoItem[i].style.textDecoration = 'none';
      }
    }
}

工作小提琴:https://jsfiddle.net/rbcLm03g/

票数 1
EN

Stack Overflow用户

发布于 2020-02-07 08:36:33

不要过多地展开代码,编写如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let checkItem = document.querySelectorAll('.checkItem');
[...checkItem].forEach((cb)=>{ // Array.from().forEach
  cb.addEventListener("change", function(){
    if(this.checked===true){
      this.parentElement.style.textDecoration = 'line-through';
    }else{
      this.parentElement.style.textDecoration = 'none';
    }
  });
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  <label class="container">one
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">two
  <input type="checkbox" class="checkItem">
 </label>

  <label class="container">three
  <input type="checkbox" class="checkItem">
 </label>
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60116923

复制
相关文章
php将多个值的数组去除重复元素 转
(adsbygoogle = window.adsbygoogle || []).push({});
双面人
2019/04/10
5.1K0
php将多个值的数组去除重复元素
                                                                            转
querySelector与querySelectorAll
HTML5学堂:JS获取节点的方法很多,但真正常用的或许就是通过id和标签获取节点,用传统的几种方法想要快速的查找到某个标签,就意味着需要更多的id,命名多了自然就烦了,接下来给大家介绍的方法就能简化很多操作。 常用的获取节点的方法 JS中经常需要获取节点,下面四种是较为常见的。 1、通过id获取节点:document.getElementById("test") 2、通过标签获取节点:document.getElementsByTagName("div") 3、通过类名获取节点:document.getE
HTML5学堂
2018/03/12
1.4K0
新增的querySelector、querySelectorAll测试
一个个的解释这些选择器也没有必要,我们结合前面的数组知识,写一段代码来说明。页面上有一组元素,然后会依据我们数组中的预订选择值选择相应元素,并将背景变红色,同时提示选择器的含义。这样的代码便于运行理解和扩展。
全栈程序员站长
2022/07/15
3930
openwrt将LAN口改为WAN方法
牢骚 折腾了好几个好几个小时,终于搞好了。原因就是因为固件里面的端口序号和实际路由器后面的序号不一致,导致我的设置和物理连接对不上,这是个巨坑。 折腾需求 PS:我家里面有两条宽带,一条中国联通50M,一条中国移动50M。 折腾多WAN口(就是把LAN口改为WAN口)的主要目的是我想是默认上网走联通,部分IP(什么IP你懂的)通过静态路由走移动出去,因为移动的国际出口在中国香港,出国速度相对来说好一些。 折腾方法 1.依次点开-网络-交换机 2.首先要启用VLan,可
行 者
2018/03/26
16.6K0
openwrt将LAN口改为WAN方法
python 将网卡改为嗅探功能
def pktPrint(pkt): if pkt.haslayer(Dot11Beacon): print '[+] Detected 802.11 Beacon Frame' elif pkt.haslayer(Dot11ProbeReq): print '[+] Detected 802.11 Probe Request Frame' elif pkt.haslayer(TCP): print '[+] Detected a TCP Packet' elif pkt.haslayer(DNS): print '[+] Detected a DNS Packet'
用户5760343
2019/07/31
1.2K0
python 将网卡改为嗅探功能
多个checkbox复选框触发点击事件
形如上面这种有list输出到前台的一组复选框,怎么点击其中一个可以触发jquery事件呢?
全栈程序员站长
2022/08/05
1.9K0
nestjs将底层由express改为fastify
nestjs默认使用的http框架为express,代码如下:// 输入代码内容import { NestFactory } from '@nestjs/core';import { AppModule } from './app.module';async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000);}bootstrap();在这里将express替换为fa
挥刀北上
2023/05/24
7900
nestjs将底层由express改为fastify
【春节日更】写一个通用的事件侦听器函数
今日分享,面试题一道: 写一个通用的事件侦听器函数(机试题) 本题不难,主要是要能理解,它想考你的是什么? 此题主要考你:事件不同操作的兼容写法 具体实现,可以参考下面代码的实现思路
用户9914333
2022/07/22
4990
typecho将Gravatar头像改为QQ头像
找到主题下的comments.php文件,查找关键字gravatar 我们会发现下面一段语句
逍遥子大表哥
2021/12/17
5.2K0
typecho将Gravatar头像改为QQ头像
Typecho将Gravatar头像改为QQ头像
相信大部分做过网站的朋友都知道,Gravatar是一个全球性的头像设置平台 除中国以外大部分网站都是调用的此平台头像,但因为我们伟大的祖国有一般人射不穿的城墙 所以用这个头像平台的用户很少,导致大部分使用此头像平台的网站 评论区总会有很多Gravatar的官方默认头像
HCG_Sky
2020/07/24
3K0
几天后,GitHub 的 “master” 将更改为 “main”
GitHub 官方表示,从今年 10 月 1 日起,在该平台上创建的所有新的源代码仓库将默认被命名为 "main",而不是原先的"master"。值得注意的是,现有的存储库不会受到此更改影响。
芋道源码
2020/10/09
9890
几天后,GitHub 的 “master” 将更改为 “main”
Linux将中文目录名改为英文
修改系统当前语言环境export LANG=en_US 2.更新家目录的文… 转自链接:《红黑联盟》
白凡
2018/08/07
3.6K0
几天后,GitHub的“master”将更改为“main”
GitHub 官方表示,从今年 10 月 1 日起,在该平台上创建的所有新的源代码仓库将默认被命名为 "main",而不是原先的"master"。值得注意的是,现有的存储库不会受到此更改影响。
会呼吸的Coder
2020/09/28
5070
2.4&2.5 将例子改为你所需要的&小结
你现在有机会使用例子服务器进行工作,你可能想知道什么方式能够最好处理你的定制需求,你有大量的选择。你可以使用example/ 文件夹,然后迎合自己的需求改变它。但是我们认为复制一个/example,将自己的应用复制一个example/。当你使用自己应用的时候,这允许你改变某些东西。
幽鸿
2020/04/02
3290
排他操作
① 用到新的鼠标事件 鼠标经过 onmouseover 鼠标离开 onmouseout
梨涡浅笑
2020/10/27
1.3K0
排他操作
如何将Angular localhost:4200 改为IP
ust specify the IP in --host option like ng serve --host 192.16.1.1
用户6421725
2020/01/16
9300
将 UWP 中 CommandBar 的展开方向改为向下展开
发布于 2018-10-05 19:37 更新于 2018-10-16 08:57
walterlv
2020/02/10
1.7K0
Vue的 侦听器 watch
watch主要用于监控vue实例的变化,它监控的变量当然必须在data里面声明才可以,
wust小吴
2019/12/27
6550
侦听器watch
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。 这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。
名字是乱打的
2021/12/22
6850
侦听器watch
多个扇形元素绕圆旋转
这种效果有很多方案,最后选择了一个比较简单的方案,就是一个position: relative;的 div 。包裹5个position: absolute;的div。 通过旋转,调整5个div的 top 与 left,而产生弧度,并使中心点都指向圆心。 黄色扇形与文字 都是在5个div内部。
拿我格子衫来
2023/10/19
2560
多个扇形元素绕圆旋转

相似问题

使用querySelectorAll选择多个元素

20

如何将querySelector更改为querySelectorAll?

16

用querySelectorAll刮除多个元素

11

使用querySelectorAll更新多个元素样式

12

用querySelectorAll迭代forEach的多个元素

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文