javascript - 在循环中更改侦听器 - 只有第一个有效
问题描述
我已经构建了一个表单,其中有一个“添加行”按钮可以添加另一行输入(如果用户需要它)。
然而,在这一行有一个select
需要change
处理程序的输入。所以我所做的是,每次单击添加新行的按钮时,每个select
输入(具有相同的name
属性)都被赋予一个独特的id
像这样
let creditorInputs = $('select[name="creditors"]');
console.log(creditorInputs);
creditorInputs.map(i => {
$(creditorInputs[i]).attr('id', `creditorSelect${i}`);
这给了他们一个“creditorSelect0,creditorSelect1”等的ID
但是在循环的下方,我添加了一个change
侦听器,当我单击选择输入并更改其值时,它似乎只影响页面上的第一个。
这是完整的脚本:
$('#addrowothermort').click(() => {
let creditorInputs = $('select[name="creditors"]');
console.log(creditorInputs);
creditorInputs.map(i => {
$(creditorInputs[i]).attr('id', `creditorSelect${i}`);
$(`#creditorSelect${i}`).change(() => {
console.log("Changed");
});
});
});
编辑:
$('#tabs-6').click(event => {
event.preventDefault();
if(event.target.name == 'creditors') {
let rightInput = event.target;
rightInput.addEventListener('change', () => {
console.log(rightInput.value);
})
}
})
解决方案
将事件嵌入到循环中的每个选择将再次附加事件,
所以无论是在循环外使用事件委托,还是将事件附加到没有循环的dreclyt创建的输入,
建议稍微改变逻辑,创建创建输入并将点击嵌入其中的函数,然后计算创建者输入的数量并根据输入数量设置新创建的 id。
见下面的片段:
var arr = [{
val: 1,
text: 'One'
},
{
val: 2,
text: 'Two'
},
{
val: 3,
text: 'Three'
}
];
function createSelect(arr) {
var select = $('<select>').appendTo('#container');
$(arr).each(function() {
select.append($("<option>").attr('value', this.val).text(this.text));
});
return select;
}
$('#addrowothermort').click(() => {
let $select = createSelect(arr);
$select.attr("name", "creditors");
let selectLength = $('select[name="creditors"]').length - 1 | 0;
$select.attr("name", "creditors");
$select.attr("id", selectLength);
$select.on("change", function() {
console.log("Change in ", $(this).attr("id"));
});
});
select {
margin: 5px 20px 0px 0px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="addrowothermort">add row </button>
<div id="container"></div>
推荐阅读
- python - 高效的布尔磁盘包装掩码
- php - Laravel 文档多次上传未保存到数据库
- xcode - 文件选择上的 iCloud Drive 不起作用
- java-11 - Java11 中 AuthCacheValue 和 AuthCacheImpl 的替代方案是什么
- flutter - 如何在flutter中实现搜索listview
- javascript - 在 TypeScript 映射中使用默认参数理解 HOF
- javascript - React 渲染元素无效,而导入和导出似乎没问题
- kubernetes - Spring 批处理工作程序 pod 仅安排 2 个工作程序节点
- postgresql - Docker 撰写将 ECONNREFUSED 127.0.0.1:3333 与 AdonisJS、Postgres 连接
- bash - Bash:使用 printf 在动态终端宽度的任一侧填充中心和彩色文本