javascript – 当文本区域插入符号移动时执行
javascript – execute when textarea caret is moved
我有文本区域,我想更改说明插入符号(光标)后是什么字符的文本。
<textarea id="text"></textarea>
<br/>
Character after the caret: <span id="char"></span>
我知道如何获得插入符位置。问题是我不知道当用户移动插入符时会调用什么事件(通过键入、按箭头键、单击、粘贴文本、剪切文本……)。
我认为没有内置事件可以检查这一点,但您可以结合使用 keypress
、mousedown
和其他可以触发插入符号位置更改的事件,然后检查文本区域的 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 未定义,selectionStart
和 selectionEnd
将工作。
全局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>
我有文本区域,我想更改说明插入符号(光标)后是什么字符的文本。
<textarea id="text"></textarea>
<br/>
Character after the caret: <span id="char"></span>
我知道如何获得插入符位置。问题是我不知道当用户移动插入符时会调用什么事件(通过键入、按箭头键、单击、粘贴文本、剪切文本……)。
我认为没有内置事件可以检查这一点,但您可以结合使用 keypress
、mousedown
和其他可以触发插入符号位置更改的事件,然后检查文本区域的 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 未定义,selectionStart
和 selectionEnd
将工作。
全局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>