【发布时间】:2017-11-12 07:01:13
【问题描述】:
我有一个 <textarea> 元素,我可以监听某些按键。就像用户键入 Tab 键一样,我会阻止更改焦点的默认操作并在正确的位置添加制表符。
问题是当用户按下我听的一个键时,撤消有点混乱。如何使撤消/重做功能起作用?我想过听 ctrl/cmd-z 和 ctrl/cmd-shift-z 按键,记录所有内容,并处理撤消/重做,但是编辑和上下文菜单选项不起作用......
您可以通过键入带有制表符的字母并回车然后尝试撤消和重做来查看:
const textarea = document.querySelector('textarea')
textarea.addEventListener('keydown', function (event) {
if (event.key == "Tab") {
event.preventDefault()
const cursor = textarea.selectionStart
textarea.value = textarea.value.slice(0, cursor) + '\t' + textarea.value.slice(textarea.selectionEnd)
textarea.selectionStart = textarea.selectionEnd = cursor + 1
} else if (event.key == "Enter") {
event.preventDefault()
const cursor = textarea.selectionStart
textarea.value = textarea.value.slice(0, cursor) + '\n' + textarea.value.slice(textarea.selectionEnd)
textarea.selectionStart = textarea.selectionEnd = cursor + 1
}
})
<textarea cols="50" rows="20"></textarea>
【问题讨论】:
-
当我在上面运行它时它对我有用,我使用的是 firefox
-
它也适用于我的代码,Google Crome 版本 59.0.3071.86(官方版本)(64 位)
-
有趣的是它对你们有用。在 macOS 10.12.5 上的 Google Chrome 版本 59.0.3071.86(官方构建)(64 位)上,它始终失败。我刚刚在最新的 Firefox 上试用过,撤消/重做效果很好!
标签: javascript html textarea preventdefault