javascript - 从 html oninput() 事件调用 javascript 中的对象方法
问题描述
在 javascript 中,我有一个相同类的对象列表。每个对象都有相同的变量和方法。 对于添加到列表中的每个对象,都会在 html 代码中添加一个输入字段。
现在,当输入字段的值发生更改(<input oninput=...>
)时,我想调用inputModified()
列表中与输入字段一起添加到列表中的确切对象的方法。您将如何实现这一目标?
此外,如果从列表中删除了一个对象,那么为该对象添加的 html 代码也会被删除。
增量 id 是唯一的方法吗?另外,请注意我不能使用 jquery 或类似的东西。谢谢!
解决方案
最好的方法是根本不使用<input oninput=...>
。使用现代事件处理。然后,您要么附加一个关闭列表中条目的处理程序,要么将列表中的位置包含在元素上,并input
在这些input
s 所在的容器上使用委托处理程序来确定要更新列表中的哪个条目。
这是第一个选项的示例,关闭列表中的条目:
function addToDOM(entry) {
const input = document.createElement("input");
input.type = "text";
input.value = entry.value;
// The event handler closes over `input` and `entry`
input.addEventListener("input", function() {
entry.value = input.value;
});
return input;
}
const list = [];
const container = document.getElementById("container");
for (let n = 0; n < 10; ++n) {
const entry = {
value: `Value ${n + 1}`
};
container.appendChild(addToDOM(entry));
list.push(entry);
}
// Adding another later
setTimeout(() => {
const entry = {
value: "Added later"
};
container.appendChild(addToDOM(entry));
list.push(entry);
}, 800);
document.getElementById("btnShowAll").addEventListener("click", function() {
list.forEach(({value}, index) => {
console.log(`[${index}].value = ${value}`);
});
});
<input type="button" id="btnShowAll" value="Show All">
<div id="container"></div>
这是带有单个委托处理程序的第二个选项的示例。但是请注意,如果您修改列表,我们作为data-*
属性存储的索引会过期:
function addToDOM(entry, index) {
const input = document.createElement("input");
input.type = "text";
input.value = entry.value;
input.setAttribute("data-index", index);
return input;
}
const list = [];
const container = document.getElementById("container");
container.addEventListener("input", function(e) {
const input = e.target;
const index = +input.getAttribute("data-index");
list[index].value = input.value;
});
for (let n = 0; n < 10; ++n) {
const entry = {
value: `Value ${n + 1}`
};
container.appendChild(addToDOM(entry, list.length));
list.push(entry);
}
// Adding another later
setTimeout(() => {
const entry = {
value: "Added later"
};
container.appendChild(addToDOM(entry, list.length));
list.push(entry);
}, 800);
document.getElementById("btnShowAll").addEventListener("click", function() {
list.forEach(({value}, index) => {
console.log(`[${index}].value = ${value}`);
});
});
<input type="button" id="btnShowAll" value="Show All">
<div id="container"></div>
推荐阅读
- android - Android 蓝牙 HCI:蓝牙控制器如何与 DSP 通信?
- powershell - Powershell 中的“Get-FileMetaData”不是 Cmdlet
- javascript - ReactJS 分页
- http - 获取 SocketException:操作系统错误:连接超时,errno = 110,地址 = 10.0.2.2,端口 = 47732
- reactjs - 如何在 AWS Beanstalk 上将 React 的 process.env.NODE_ENV 设置为生产环境
- unity3d - 获取整数中的数字而不转换为字符串
- flutter - 出现错误:参数类型“对象?” 不能分配给参数类型“地图”
' - angular - 角度模板函数调用
- c# - 在 dotnet core 中使用 NLog 捕获控制器名称和方法名称
- python - 如何使用 odfpy 在电子表格中使用粗体文本?