首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当尝试在函数中显示/隐藏时,foreach循环中的div #id仅选择最后一个变量

这个问题涉及到JavaScript中的闭包和作用域的概念。当你在foreach循环中为每个div元素绑定事件处理函数时,由于JavaScript的作用域规则,循环结束后,所有的事件处理函数都会引用循环中的最后一个变量。这就是为什么只有最后一个div的显示/隐藏功能正常工作的原因。

基础概念

  1. 闭包:闭包是指能够访问自由变量的函数。
  2. 作用域:作用域定义了变量的可见性和生命周期。

解决方案

为了解决这个问题,你需要确保每个事件处理函数都有自己的作用域,这样它们就不会共享同一个变量。可以通过立即执行函数表达式(IIFE)或者使用let关键字来实现。

使用立即执行函数表达式(IIFE)

代码语言:txt
复制
divs.forEach(function(div, index) {
    (function(index) {
        div.addEventListener('click', function() {
            document.getElementById('id' + index).style.display = 'none'; // 或者 'block'
        });
    })(index);
});

使用let关键字

代码语言:txt
复制
for (let i = 0; i < divs.length; i++) {
    divs[i].addEventListener('click', function() {
        document.getElementById('id' + i).style.display = 'none'; // 或者 'block'
    });
}

优势

  • 立即执行函数表达式(IIFE):创建了一个新的作用域,使得每个事件处理函数都有自己的变量副本。
  • let关键字:在每次迭代中都会创建一个新的绑定,因此每个循环迭代都有自己的i

应用场景

这种技术在需要为循环中的每个元素绑定事件处理函数时非常有用,特别是在处理DOM操作和事件监听时。

示例代码

假设你有一组div元素,每个都有一个唯一的ID,你想在点击时隐藏或显示它们。

代码语言:txt
复制
<div id="id0">Div 0</div>
<div id="id1">Div 1</div>
<div id="id2">Div 2</div>
<!-- 更多的 div -->

使用上述任一方法,你可以确保点击任何一个div时,只有对应的那个div会被隐藏或显示。

通过这种方式,你可以避免因为作用域问题导致的错误,并且能够正确地为每个元素绑定事件处理函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在JavaScript中使用for循环

比如,你可能想向控制台或HTML元素打印一个对象的属性和它的值。在这种情况下,for...in循环是一个不错的选择。 当使用for…in循环调试对象以及对象的值时,你应该始终记住,迭代是没有顺序的。...在IE中,当使用for...in循环时,它将遍历一开始就在数组中的四个项目,然后再遍历在索引3的位置添加的那一项。 迭代时进行更改 对属性的任何添加、删除或修改都不能保证有序的迭代。...Before div id="loopResultsBefore">div> After div id="loopResultsAfter">div>...for循环的替代方案 forEach在JavaScript中是数组原型的一个方法,它允许我们在回调函数中遍历数组的元素和它们的索引。...「回调函数」是你传递给另一个方法或函数的函数,作为该方法或函数执行的一部分而被执行。当涉及到JavaScript中的forEach时,它意味着回调函数将在每个迭代中执行,接收迭代中的当前项作为参数。

5.1K10
  • 怎么用 JavaScript 构建自定义的 HTML5 视频播放器

    我推荐你使用最新版本的谷歌浏览器,因为在本文编写时,我们将添加的一些功能(比如画中画功能)仅适用于谷歌(Webkit 内核)浏览器。 开始 我在 GitHub 中为本教程准备了开始文件。...在 元素中,我们有播放和暂停按钮,但是一次我们只能展示其中一个,另一个则隐藏。现在我们要做的就是切换每个图标的 hidden 类,以便根据视频的状态展示正确的图标。...,所有的图标都会隐藏,然后会根据条件显示其中一个图标。...当它们不被使用的时候将其隐藏起来比较好,然后当鼠标移动到视频上方再显示它们。...但是当视频停止播放的时候,我们确保控件总是展示的,所以在 hideControls() 函数中添加条件判断。

    11.3K20

    Discuz后台常用函数详解

    当您在编写后台时,需要对几个常用后台显示函数进行详细的了解  下面的函数讲解按照重要性、常用性进行排序 目录 ---- showsetting()表单显示  cpmsg()提示消息  showformheader... - 强制描述文字  $extra - 表单扩展属性  $setid - 用于拼接表单外层Div的id ---- 使用方法举例:  以文本形式输出表单(站点名称 text): showsetting('... - 为语言包中的变量关键词指定值,以数组形式输入  $extra - 消息文字扩展  $halt - 是否输出“Discuz! ...()创建表格头 返回值:无  参数: $title - 如果输入title则显示标题,class为header,否则仅显示一个table头  $classname - 定义此输出表格的CSS样式  $extra...> - TD 标签的格式定义,如 class,colspan 等  $tdtext  - TD内显示的内容  $return 是否返回值 此函数多用于循环中,用来逐行创建一个有规律的数据列表如

    3.5K51

    高性能JavaScript

    因为局部变量位于作用域链的第一个对象中,全局变量位于作用域链的最后一环。变量在作用域链的位置越深,访问的时间就越长。...7、遍历数组明显快于同样大小和内容的HTML集合 8、 for循环时,HTML某元素集合的长度不建议直接作为循环终止条件,最好将集合的长度赋给一个变量,然后使用变量作为循环终止条件; 原因:当每次迭代过程访问集合的...从文档流中摘除该元素,摘除该元素的方法有: a、对其应用多重改变 b、将元素带回文档中 c、使其隐藏,进行修改后在显示 d、使用文档片段创建子树,在将他拷贝进文档 var doc = document;...因此强烈建议,在数据量很大的表格中,减少鼠标在表上移动效果,减少高亮行的显示,使用高亮是个慢速过程CPU使用率会提高到80%-90%,尽量避免使用这种效果。...; 因此,因为每一个元素有一个或多个事件句柄与之相连时,可能会影响性能,毕竟连接每一个句柄都是有代价的,所以我们采用事件托管技术,在一个包装元素上挂接一个句柄,用于处理子元素发生的所有事件。

    70310

    最为常用的Laravel操作(3)-模板

    @endsection 数据显示 注:Blade 的 {{}} 语句已经经过 PHP 的 htmlentities 函数处理以避免 XSS 攻击。 Hello, {{ $name }}....在循环的时候, 可以在循环体中使用 $loop 变量, 该变量提供了一些有用的信息, 比如当前循环索引, 以及当前循环是不是第一个或最后一个迭代: @foreach ($users as $user)...@endif This is user {{ $user->id }} @endforeach 如果你身处嵌套循环, 可以通过 $loop 变量的 parent 属性访问父级循环...当前循环迭代 (从1开始) $loop->remaining 当前循环剩余的迭代 $loop->count 迭代数组元素的总数量 $loop->first 是否是当前循环的第一个迭代 $loop->last...是否是当前循环的最后一个迭代 $loop->depth 当前循环的嵌套层级 $loop->parent 嵌套循环中的父级循环变量 模板注释 {{-- This comment will not be

    16710

    1.1、文本插值

    在 Vue 模板内,JavaScript 表达式可以被使用在如下场景上: 在文本插值中 (双大括号) 在任何 Vue 指令 (以 v- 开头的特殊属性) 属性的值中 1.4.1、仅支持表达式 每个绑定仅支持单一表达式..."隐藏" : "显示" }} div v-if="isShow"> 这段文字的显示与隐藏完全是由isShow控制的,DOM控制的 在定义 v-for 的变量别名时使用解构,和解构函数参数类似: {{ message }} 当它们同时存在于一个节点上时,v-if 比 v-for 的优先级更高。这意味着 v-if 的条件将无法访问到 v-for 作用域内定义的变量别名: <!...添加与修改功能使用模式窗口 支持全选与反选,隔行换色与光棒效果 详细是点击时在弹出层中显示当前商品的所有信息 尝试分页(选做) 5.3、增强商品管理 数据从后台加载,请注意跨域(axios) 实现搜索功能

    8.8K20

    JQuery JavaScript常用API整理(前端入门必学)

    和$().click()的用法一样,最大的区别即优点是如果动态创建的元素在该选择器选中范围内是能触发回调函数。...alert("别点我2"); }); $("#button_1").click(() => { //当选中的选择器被点击时触发回调函数fn。只针对与页面已存在的选择器。...,返回一个新数组,不改变原来的数组 .join() 默认,来分割数组中的每个元素,返回一个字符串 .forEach(function(item){}) 遍历数组中的每个元素....filter(p=>p.id==1 ) 筛选元素 */ 20、++和–在左边和右边的区别 ++ -- 操作符在变量前边,先进行自身运算,在进行其他运算 操作符在变量后边...如果没有值满足测试函数,则返回 undefined。 filter() 方法创建一个包含所有通过测试函数的元素的新数组。如果没有元素满足测试函数,则返回一个空数组。

    70520

    Smarty的基本使用与总结

    当访问完后将会在templates_c中生成一个相应的混编文件 ? 这就是Smarty在PHP中的简单使用。...注意:section只能使用一次,若有多个section引入多个段落变量则最后一个会覆盖前面的所有section引入的段落变量,即只有最后一个引入的段落变量有用其他作废。...3、在整个smarty.conf文件中,点(.)拥有相对较高的权限的。点的作用是将一个变量或者整个段落隐藏,不能被使用。...id='aa'> 12 这是一个div 13 div> 14 15 访问结果: ?   ...5.12、自定义函数 Smarty自带了一些自定义的函数插件,可以在模板内使用。   以下是参考smarty手册所列的自定义函数:   a、{counter},用于显示一个计数器。

    1.4K30

    【Html.js——功能实现】布局切换(蓝桥杯真题-18556)【合集】

    显示模式按钮点击事件: 为 switching 按钮添加点击事件监听器,当点击时,将 mode 元素(布局选项区域)的 display 属性设置为 flex,使其显示出来。 3....当点击一个选项时,首先移除所有选项的 active 类名,然后给当前点击的选项添加 active 类名。...如果点击的是第三个选项(工具模式),显示工具区域 tool。 最后隐藏布局选项区域 mode。 三、CSS 部分 1....点击模式按钮:用户点击导航栏中的模式按钮(id="switching"),触发 JavaScript 中的点击事件,显示布局选项区域(id="mode")。 3....根据点击的选项,执行不同的布局处理: 经典模式:隐藏工具区域,设置布局容器为两栏布局。 浏览模式:隐藏工具区域,设置布局容器为三栏布局。 工具模式:显示工具区域。 最后隐藏布局选项区域。

    5300

    # 学会这些 Web API 使你的开发效率翻倍

    当用户在页面上选择文本时,会触发mouseup事件,然后调用handleSelection函数来处理选择事件。...在handleSelection函数中,我们首先使用window.getSelection()方法获取用户选择的文本,然后检查是否选择了文本。...如果选择了文本,我们创建一个新的span元素,并将其添加到选择范围中,然后使用removeAllRanges()方法取消选择。最后,我们使用CSS样式将高亮显示的文本突出显示。...在 JavaScript 中,我们创建了一个名为 my-channel 的广播通道对象,并定义了一个 sendMessage 函数,该函数将输入框中的文本消息发送到广播通道中。...最后,在IntersectionObserver实例的回调函数中,我们检查每个条目是否与视口相交。如果是,则将“visible”类添加到条目的目标元素中,否则将其删除。

    43520

    【ES】199-深入理解es6块级作用域的使用

    一.var 声明与变量提升机制 在JavaScript中使用var定义一个变量,无论是定义在全局作用域函数函数的局部作用域中,都会被提升到其作用域的顶部,这也是JavaScript定义变量的一个令人困惑的地方...如下: for(let i = 0;i < 100;i++){ //执行某些操作 } //报错 console.log(i); 6.循环中的创建函数 在使用var声明变量的循环中,创建一个函数非常的困难...由于函数有自己的作用域,因此在向数组中添加函数的时候,实际上循环已经运行完成,因此每次打印变量i的值都相当于是在全局中访问变量i的值,即i = 5这个值,因此实际上答案最终会返回5次5....在es5中,我们可以使用函数表达式(IIFE)来解决这个问题,因为函数表达式会创建一个自己的块级作用域。...当使用var声明一个变量时,会在全局作用域(通常情况下是浏览器window对象)中创建一个全局属性,这也就意味着可能会覆盖window对象中已经存在的一个全局变量。

    3.7K10

    :第二章 - 常见的指令的使用

    这时候,我们就可以使用v-cloak指令用于隐藏未编译完成的插值表达式,一般我们在使用时会与添加一个隐藏该元素的样式同时使用。 {{msg}} div>   大家可以看到,当页面没有显示内容时,此时 p 标签添加了一个 v-cloak 属性,同时...,从右侧的样式中可以看到,隐藏显示,当加载完成后, p 标签上去除了该属性,同时插值表达式也编译完成,正确显示出来。...我们看到当我们使用 push 方法在数组的最后添加一个数据时,之前单选框选择的数据没有发生更改,而当我们使用 unshift 方法在数组最前面添加一个数据时,单选框选择的数据就发生了更改。...这里就是因为 key 属性绑定的是数组索引的缘故,我们选中的索引值是1,当在选中的数组元素前面添加数据时,原来选中的数组数据的索引值就会加一,所以最后就会选择到别的元素。

    1.2K10

    前端常见问题

    复杂数据类型存储在堆中,数据结构复杂,占用空间较大。在栈中存储的是指向堆中的指针地址。 3、说一说你对闭包的理解? 闭包指的是有权访问另一作用域中变量的函数。 闭包会造成内存泄露的问题。...id="btn" title="防抖:一定时间内多次触发事件则重新计时">点击我div> div id="btn2" title="节流:一定时间内多次触发事件只生效一次">点击我div...important > 行内样式 > 嵌入样式/外链样式(比较同级后面会覆盖前面的)> ID选择器 > Class选择器/伪类选择器/属性选择器 > 标签选择器 > 通配符选择器 10、JS实现异步的方式...箭头函数没有自己的this,只能够继承外部函数的上下文,没有arguments,不能够作为构造函数(不能new) 当使用call和apply方法时只传递一个参数(第一个参数也就是this会被忽略)...,如果是false不渲染,根本在dom树结构中不显示 应用: v-show: 适合使用在切换频繁显示/隐藏的元素上 v-if: 适合使用在切换不频繁,且元素内容很多,渲染一次性能消耗很大的元素上 39

    87410

    Jmeter(四)_16个逻辑控制器详解

    四、ForEach控制器(ForEach Controller):   作用:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。...当指定的名称不存在时,不执行任何元素。 当Value为空时,默认执行第1个子节点元素。  示例: 1、Switch Controller选择的值为 客服登录 ? 2、执行结果: ?...设计的数值 Per User: 依据网上的说明在选择Total Executions时,勾选时会在每个线程中执行的次数。...  可能的条件值有: 空:最后一个示例循环失败时退出循环 LAST:最后一个示例循环失败时退出循环。 ...如果之前的最后一个示例只是循环失败,不进入循环。 false:退出时(或不输入)循环条件等于字符串“ 假 ” 条件可以是任何变量或函数,最终等于字符串” 假 ”。

    4.5K31

    ajax使用案例

    后面需要对服务器给我们返回的数据进行操作,那么我们就取4中的数据用变量的形式放到ajax创建的html标签中。这样前端访问到这个页面时就要从后端获取来的数据进行渲染的网页了。...这样的话就是每次点击1处表的某条数据内容,在2处对应这条数据id的2处表的内容在后端查询出来并在下面这个ul中显示。...所以插入的li标签比如开发者工具,要将这个api返回的数据中的id数作为开发者工具这个li的一个属性记录下来。点击事件反生时就根据获取到的id属性值,来显示另一个表中相同这个外键id的数据表内容。...注意这里,在反引号里面需要{变量}引用,在外面似乎是不需要的,这里在外面是加了{}报错语法问题。在反引号外面这个变量不加{}才是对的。//疑问,{}引用变量只是反引号中引的吗?...}这个值 写点击事件,就是在函数作用域里获取点击对象的id,然后将id赋值给sub_category变量,这样请求的url即改变了。

    11.6K20

    如何根据页面标签自动生成文章目录?分析+代码详解

    遍历文章,很简单,我们使用childNodes方法和foreach循坏即可。 childNodes 属性返回节点的子节点集合,以 NodeList 对象。 实操演示如下。...遍历文章 原生JavaScript 单层包括,也就是需要生成目录的文章,外层有一个div>div>或其他双标签进行嵌套,如: [只有一个div双标签进行嵌套] 这个时候我们在根标签加上一个ID即可...首先在循坏遍历的外侧,添加一个数组,如果页面元素标签,在这个数组范围内,就提取到标签集合并生成一个对象丢到titles内: // 哈哈,三级目录差不多了吧。...云+社区也是三级目录~~~ const titleTag = ["H1", "H2", "H3"]; let titles = []; 在遍历文章内容时,就可以判断标签是不是在数组内: if (titleTag.includes...首先是给文章每个标签,加上id,id的生成,我们使用变量时的index即可: const id = "header-" + index; // 设置元素id e.setAttribute("id

    5.3K91

    【前端】Web前端学习笔记【1】

    闭包 在面向对象的程序设计语言里,比如Java和C++,要在对象内部封装一个私有变量,可以用private修饰一个成员变量。...在没有class机制,只有函数的语言里,借助闭包,同样可以封装一个私有变量。...换句话说,闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。...ECMAScript的函数调用中,所有参数的传递都是值传递(当传递的参数代表一个对象时,也仅仅是把实参存储的内存地址赋值给形参,还是值传递),不可能通过引用传递参数。...此外,jQuery还有很多有用的选择器,例如,选出可见的或隐藏的元素: $('div:visible'); // 所有可见的div $('div:hidden'); // 所有隐藏的div ======

    40690

    Android Notes|BottomNavigationView 爱上 Lottie

    以前大部分项目底部导航栏关于图片部分的实现,要么两套图 selector 切换,要么通过着色器 tint 进行渲染,总之最后呈现的效果便是在点击时两张图静态切换,说 Low 吧,也还凑合,但是总是没那么高大上...设置字体颜色,尤其默认以及选中,同样可以通过 selector 选择器进行对应设置。 而关于选中状态切换时,对应标题字体大小发生改变以及导航栏高度,都可以通过在 dimens 定义如下解决: 的属性: app:labelVisibilityMode:item 标签显示模式 auto:item 少于等于 3 个时,标题处于显示状态;大于等于 4 个,选中才显示标题; selected...mPreClickPosition], nav_bottom_bar ) } } 问题汇总 鸡老大说: 遇到问题是好事儿,多总结,多积累,掌握一个循循渐进的过程...身为猿猿,面对实际开发中遇到的问题,一定要采取多方案,首要保证内容、结果的输出,其次才是合理的循循渐进的优化。 2、BottomNavigationView Item 长按提示怎么搞掉?

    3.7K21
    领券