javascript - 事件处理程序去抖动后输入事件发生变化
问题描述
我有一个简单的表单和一个字段来从该表单呈现该输入字段的值
<div id="app">
<form id="form">
<label
>some form
<input type="text" name="myInput" />
</label>
</form>
<p id="field"></p>
</div>
function getFormValues(event) {
const data = new FormData(event.currentTarget);
const { myInput } = Object.fromEntries(data);
console.log("value", myInput);
field.textContent = myInput;
}
const form = document.getElementById("form");
const field = document.getElementById("field");
form.addEventListener("input", getFormValues); //
到目前为止它有效。然而,一旦我用我写的这个工具去抖动它(顺便说一句,我很清楚lodash
那里的工具可以做同样的事情)
function debounce(fn, delay) {
let timerId;
return (...args) => {
if (timerId) clearTimeout(timerId);
timerId = setTimeout(() => {
fn(...args);
}, delay);
};
}
const debouncedGetFormValues = debounce(getFormValues, 500);
form.addEventListener("input", debouncedGetFormValues); // Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.
突然间我得到一个错误说Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.
这是现场演示https://codesandbox.io/s/awesome-rosalind-1brqi?file=/src/index.js
不知道这里出了什么问题。
请不要仅仅因为setTimeout 之后事件 currentTarget 发生变化而投票结束这个问题。它不能解决我的问题。即使您更改
const data = new FormData(event.currentTarget);
为const data = new FormData(event.target);
. 问题仍然存在。
解决方案
问题来自input
事件的行为。的实例InputEvent
带有相应的输入元素 as target
,即使您在表单元素上添加了侦听器。
因此,只需将您的代码重写为:
function getFormValues(event) {
const form = event.target.form; // Get the form element
const data = new FormData(form);
const { myInput } = Object.fromEntries(data);
console.log("value", myInput);
field.textContent = myInput;
}
推荐阅读
- python - 根据 X 轴值更改熊猫条形图的颜色?
- c# - ResourceDictionary 无法打印“<”
- json - 如何在swift 5中将json url api解析为全局变量数组
- angular - Angular 9.0.7 Ivy:ngcc 未正确处理 BrowserAnimationsModule,或与 Angular Ivy 不兼容
- docker - UCP 和 HTTP 服务器在 Docker 上的共存
- elasticsearch - 使用用户上传的文档在 ElasticSearch 中添加内容?
- excel - 如何检测事件是由最终用户触发的?(通过代码忽略事件触发)
- sql - SQL:不是单组分组函数
- reactjs - 阻止 Material-UI 的 Select Popover 改变位置
- flutter - Flutter :- 键盘在焦点上导致布局在底部溢出