javascript - Javascript Vanilla - 输入/GetElementsByTagName 上的双击事件处理程序
问题描述
问题:无法为我生成的输入分配双击事件处理程序;这是否可行getElementsByTagName
?
谢谢你的帮助
这是代码:
生成的输入
function list_tasks() {
let container = document.getElementById("todo");
container.innerHTML = ""
if (task_array.length > 0) {
for (let i = 0; i < task_array.length; i++) {
let input = document.createElement("input");
input.value = task_array[i];
input.classList.add("record");
input.disabled = true;
container.appendChild(input);
}
}
}
附加事件
document.getElementsByClassName("record").addEventListener("dblclick", editTask);
并且永远不会调用 console.log
function editTask(e){
console.log("double click")
}
更新 尝试遍历数组,但仍然没有触发双击事件
let record = document.getElementsByClassName("record");
for(var i = 0; i <= record.length; i++){
document.getElementsByClassName("record")[i].addEventListener("dblclick", editTask);
}
解决方案
这不起作用的原因是因为您将输入标记为禁用。禁用的输入不会对某些事件做出反应,看起来双击就是其中之一。
此外,正如@Royson 所写,getElementsByClassName()
返回多个元素的列表。如果您想为所有这些添加事件侦听器,您有 2 个选项:
如果可能的话,最好的 IMO 是在list_tasks()
函数中创建元素时附加它:
let input = document.createElement("input");
input.value = task_array[i];
input.classList.add("record");
input.disabled = true;
input.addEventListener("dblclick", editTask); // <--- here
container.appendChild(input);
如果由于无法访问范围而无法做到这一点,则只需遍历以下结果getElementsByClassName()
:
Array.from(document.getElementsByClassName("record")).forEach(el => el.addEventListener("dblclick", editTask));
编辑:规范说应该在禁用的输入上禁用“点击”事件。事件虽然没有直接指定双击,但我的猜测是它也暗示它是一次点击,或者它需要启用点击以便它可以捕获两个快速的。 https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#enabling-and-disabling-form-controls%3A-the-disabled-attribute