我正在编写一个语法高亮器。该高亮器应该在输入文本和使用箭头键导航时立即更新高亮显示。
我面临的问题是,当触发“keypress”事件时,仍然会通过
示例:
我面临的问题是,当触发“keypress”事件时,仍然会通过
window.getSelection()
获取文本光标的旧位置。示例:
function handleKeyEvent(evt) {
console.log(evt.type, window.getSelection().getRangeAt(0).startOffset);
}
var div = document.querySelector("div");
div.addEventListener("keydown", handleKeyEvent);
div.addEventListener("keypress", handleKeyEvent);
div.addEventListener("input", handleKeyEvent);
div.addEventListener("keyup", handleKeyEvent);
<div contenteditable="true">f<span class="highlight">oo</span></div>
在这个示例中,将插入符号放置在单词“foo”之前,然后按下→(右箭头键)。
在您喜欢的开发工具的控制台中,您将看到以下内容:
keydown 0
keypress 0
keyup 1
那个 0
除了 keypress
外显然是旧的插入符位置。如果你按住 → 稍微久一点,你会得到类似下面的内容:
keydown 0
keypress 0
keydown 1
keypress 1
keydown 1
keypress 1
keydown 2
keypress 2
keyup 2
我想要获取新的插入符位置,就像在“keyup”或“input”事件中一样。然而,“keyup”事件触发太晚了(我想在按下键时突出语法),而“input”事件仅在实际输入时触发(但→不会产生任何输入)。
是否有一个事件是在插入符位置改变时触发而不仅仅是在输入时触发?或者我必须计算文本光标的位置,如果是这样,如何计算?(我假设当文本换行并且您按下↓键时,情况可能会变得非常复杂。)
keypress
事件不会被触发,但是它显然已经被标记为过时了。正如我现在所看到的,规范说明人们应该使用beforeinput
事件。而且keydown
也会持续触发。虽然所有这些事件都会过早地触发。我现在已经在UI事件规范上提交了一个问题,希望能得到一个适当的事件来解决这个问题。 - Sebastian Zartner