javascript - eventListener 总是在第一个元素上触发
问题描述
- 页面上有 3 个
<input type="file">
元素。 - 每个元素都有一个“更改”事件侦听器。
当我单击第二个或第三个元素时,第一个元素的标签会记录到控制台。
我究竟做错了什么?
沙盒:https ://jsfiddle.net/x01e4kgu/3/
HTML
<form action="">
<div class="input--upload">
<label for="attachment">Upload 1</label>
<input type="file" name="attachment[]" id="attachment">
</div>
<div class="input--upload">
<label for="attachment">Upload 2</label>
<input type="file" name="attachment[]" id="attachment">
</div>
<div class="input--upload">
<label for="attachment">Upload 3</label>
<input type="file" name="attachment[]" id="attachment">
</div>
</form>
JS
const fileInputs = document.querySelectorAll('.input--upload input')
fileInputs.forEach(input => {
input.addEventListener('change', function(e) {
const label = e.target.parentNode.querySelector('label')
console.log(label)
})
})
解决方案
这边走
ID 必须是唯一的(您的代码中不需要任何一个)您的
所有label
元素都使用for
指向相同的相同属性id
,所有这些都只涉及具有此属性的第一个元素id
(其他元素被忽略)用于
onchange
使用箭头函数,
它允许您绕过e.target...
,因为它允许您停留在局部变量的范围内(实际上只inEl
)
<form action="">
<div class="input--upload">
<label>
Upload 1
<input type="file" name="attachment[]" >
</label>
</div>
<div class="input--upload">
<label>
Upload 2
<input type="file" name="attachment[]" >
</label>
</div>
<div class="input--upload">
<label >
Upload 3
<input type="file" name="attachment[]" ">
</label>
</div>
</form>
const fileInputs = document.querySelectorAll('div.input--upload input')
fileInputs.forEach( inEl =>
{
inEl.onchange = e =>
{
let el_Lb = inEl.closest('label')
console.log( el_Lb.textContent )
}
})
推荐阅读
- java - 使从数据库中检索的字符串不区分大小写,即使它作为大写字母保存到数据库中,也可以以小写形式检索
- javascript - 可以将多个 i18n 属性加载到数组中吗?(JavaScript)
- python - 在遵循 Python 脚本时需要帮助
- spring - 向 Spring Boot REST API 编写测试以从数据库中检索数据
- jmeter - Tar.gz 文件未使用 Jmeter 在 Google 云存储桶中解压
- visual-studio - 您如何优先考虑将 Visual Studio 中的 NVBLAS 链接到 Armadillo?
- python - 如何在 Python 中将 1 分钟的开盘高低收盘数据转换为另一个时间范围(fx:5 分钟,1 小时)?
- python - Python ModuleNotFoundError:我无法导入我的模块
- android - Flutter Android 闪屏错误
- flutter - 实时获取当前登录用户的数据 - Flutter & Firestore