选区变化事件在文本域无效,因其仅作用于文档全局,不响应内部选区变化。通过监听鼠标松开、按键松开和聚焦事件,结合选区起始与结束位置属性获取选中文本长度,可实时更新按钮文本,常用于富文本编辑器状态同步。
本文详解 selectionchange 事件在
在 HTML 开发中,selectionchange 事件不会在 ,这是许多开发者容易忽略的关键点。该事件仅在全局文档级别响应用户对可编辑元素外内容(如普通文本、div 内容)的选中行为。而
因此,类似以下代码虽然能捕获页面标题等全局选中行为,但对
长期稳定更新的攒劲资源: >>>点此立即查看<<<
document.addEventListener('selectionchange', function() { ... });导致显示选中文本长度的按钮 selectedCountBtn 无法更新。问题根源在于选错了监听对象。
要绕过这一限制,实践中需要组合监听几个与选择行为直接相关的事件,并主动查询选区。该方案在 Chrome、Firefox、Safari、Edge 等多个浏览器中均验证可靠:
查询选中文本时,必须使用 textarea.selectionStart 和 textarea.selectionEnd 属性,而非 window.getSelection()。后者在
function getSelectedTextInTextarea() { const textarea = document.getElementById('textArea'); const start = textarea.selectionStart; const end = textarea.selectionEnd; return textarea.value.substring(start, end);}function updateSelectedCharCount() { const selectedText = getSelectedTextInTextarea(); const btn = document.getElementById('selectedCountBtn'); btn.textContent = 'B' + selectedText.length; // 显示 "B0", "B5" 等}// 绑定到 textarea 元素(非 document)const textarea = document.getElementById('textArea');textarea.addEventListener('mouseup', updateSelectedCharCount);textarea.addEventListener('keyup', updateSelectedCharCount);textarea.addEventListener('focus', updateSelectedCharCount);注意事项:
- 不要用
selectionchange监听window.getSelection()在- 避免重复调用
updateSelectedCharCount()—— 原代码中既在selectionchange里赋值 "A",又通过updateSelectedCharCount()赋值 "B",造成逻辑冲突。统一使用一个函数、一种前缀(例如 "Selected: ")更清晰。- 如需更高精度(如支持双击选词、滑动选中),上述三个事件的组合已能覆盖 99% 的日常操作,无需额外引入轮询或 MutationObserver。
经过上述处理,无论用户是鼠标拖选、Shift+方向键扩展,还是双击选词,按钮都会即时更新为 Selected: 7 这样的格式。该方案稳定、高效,且无兼容性隐患。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述