javascript – 当文本区域插入符号移动时执行

javascript – execute when textarea caret is moved

我有文本区域,我想更改说明插入符号(光标)后是什么字符的文本。

<textarea id="text"></textarea>
<br/>
Character after the caret: <span id="char"></span>

我知道如何获得插入符位置。问题是我不知道当用户移动插入符时会调用什么事件(通过键入、按箭头键、单击、粘贴文本、剪切文本……)。

我认为没有内置事件可以检查这一点,但您可以结合使用 keypressmousedown 和其他可以触发插入符号位置更改的事件,然后检查文本区域的 selectionStart(指示插入符位置)的更改:

const textarea = document.querySelector('textarea');
textarea.addEventListener('keypress', checkcaret); // Every character written
textarea.addEventListener('mousedown', checkcaret); // Click down
textarea.addEventListener('touchstart', checkcaret); // Mobile
textarea.addEventListener('input', checkcaret); // Other input events
textarea.addEventListener('paste', checkcaret); // Clipboard actions
textarea.addEventListener('cut', checkcaret);
textarea.addEventListener('mousemove', checkcaret); // Selection, dragging text
textarea.addEventListener('select', checkcaret); // Some browsers support this event
textarea.addEventListener('selectstart', checkcaret); // Some browsers support this event

let pos = 0;
function checkcaret() {
  const newPos = textarea.selectionStart;
  if (newPos !== pos) {
    console.log('change to ' + newPos);
    pos = newPos;
  }
}
<textarea></textarea>

选择更改时有一个事件,selectionchange

selectionchange 事件是一个全局事件,因此可以在任何元素上添加监听器,尽管有一个实验性功能,其中 input 元素和 textarea 元素上的事件监听器仅监听该元素内选择的变化.目前仅Firefox支持实验版

然后可以通过 getSelection() 访问选择。在一些浏览器中,如果选择在 input 或 textarea 元素内,这将 return 未定义,因此如果 getSelection() returns 未定义,selectionStartselectionEnd 将工作。

全局selectionchange事件示例:

let counter = 0;

document.addEventListener("selectionchange", function () {
  document.querySelector("#counter").textContent = ++counter;
})
<textarea>sample text</textarea>
<p>sample text in a paragraph</p>
<p contenteditable>a paragraph you can edit</p>

<p><code>selectionchange</code> events: <span id="counter">0</span></p>