DOM 元素可以同时处理 keyup 和 input 事件吗?
Can a DOM element handle both keyup and input event?
在一个应用程序中,我有一个带有输入处理程序的文本输入元素。我想对退格键执行一个特殊操作,所以我添加了一个 keyup 处理程序来处理这种情况。除非字段为空,否则不会调用它 - 显然,当调用输入处理程序时,它会抑制 keyup 处理程序。
我可能可以使用 keyup 处理程序为所有内容重写代码,但这将涉及复制粘贴和其他键(删除、输入、制表等)的正确处理,我宁愿不这样做。
这是在 chrome 上进行的,但我也在 firefox 和 safari 上对其进行了测试,并且得到了相同的行为,所以这肯定是预料之中的,但我找不到它的文档。下面的代码演示了这个问题。按原样加载并输入文本时,仅调用输入处理程序。当该字段为空时,将调用 keyup 处理程序。如果删除了输入处理程序,那么当然会在每次按键时调用 keyup 处理程序。
<html>
<head>
<script>
function setup() {
document.getElementById("xxx").addEventListener("input", (ev) => alert("input"));
document.getElementById("xxx").addEventListener("keyup", (ev) => alert("keyup"));
}
window.addEventListener("load", () => setup());
</script>
</head>
<body>
test handlers: <input type="text" id="xxx" />
</body>
</html>
(示例编辑为使用 addEventListener 而不是 onevent)
我现在考虑的解决方法是使用 keydown 事件,它被调用,但我想了解为什么它有这种行为。
每次只有一个警报使另一个呼叫无效时,它们都会被调用,如果您将警报更改为日志,您会看到这一点
<html>
<head>
</head>
<body>
test handlers: <input type="text" oninput="console.log('input')" onkeyup="alert('keyup')" />
</body>
</html>
或者如果您设置超时
<html>
<head>
</head>
<body>
test handlers: <input type="text" oninput="setTimeout(()=>alert('input'),1000)" onkeyup="alert('keyup')" />
</body>
</html>
这是预料之中的,因为退格键正在更改输入,而按键是在释放按键时,而按键是在警报处于 window
时释放
在一个应用程序中,我有一个带有输入处理程序的文本输入元素。我想对退格键执行一个特殊操作,所以我添加了一个 keyup 处理程序来处理这种情况。除非字段为空,否则不会调用它 - 显然,当调用输入处理程序时,它会抑制 keyup 处理程序。
我可能可以使用 keyup 处理程序为所有内容重写代码,但这将涉及复制粘贴和其他键(删除、输入、制表等)的正确处理,我宁愿不这样做。
这是在 chrome 上进行的,但我也在 firefox 和 safari 上对其进行了测试,并且得到了相同的行为,所以这肯定是预料之中的,但我找不到它的文档。下面的代码演示了这个问题。按原样加载并输入文本时,仅调用输入处理程序。当该字段为空时,将调用 keyup 处理程序。如果删除了输入处理程序,那么当然会在每次按键时调用 keyup 处理程序。
<html>
<head>
<script>
function setup() {
document.getElementById("xxx").addEventListener("input", (ev) => alert("input"));
document.getElementById("xxx").addEventListener("keyup", (ev) => alert("keyup"));
}
window.addEventListener("load", () => setup());
</script>
</head>
<body>
test handlers: <input type="text" id="xxx" />
</body>
</html>
(示例编辑为使用 addEventListener 而不是 onevent)
我现在考虑的解决方法是使用 keydown 事件,它被调用,但我想了解为什么它有这种行为。
每次只有一个警报使另一个呼叫无效时,它们都会被调用,如果您将警报更改为日志,您会看到这一点
<html>
<head>
</head>
<body>
test handlers: <input type="text" oninput="console.log('input')" onkeyup="alert('keyup')" />
</body>
</html>
或者如果您设置超时
<html>
<head>
</head>
<body>
test handlers: <input type="text" oninput="setTimeout(()=>alert('input'),1000)" onkeyup="alert('keyup')" />
</body>
</html>
这是预料之中的,因为退格键正在更改输入,而按键是在释放按键时,而按键是在警报处于 window
时释放