应使用 input 事件而非 keyup 监听 input 标签,因 keyup 不触发粘贴、拖入、语音输入及中文上屏等场景,而 input 事件在所有值变更后可靠触发;取字数用 el.value.length 即可,无需 innertext 或 textcontent。

为什么不用 keyup 监听 input 标签
用户粘贴、拖入文字、语音输入、中文输入法上屏时,keyup 完全不触发,字数就卡住不动;而 input 事件在所有值变更后都可靠触发,包括右键粘贴、iOS 长按粘贴、自动填充等场景。IE9+ 和所有现代移动端浏览器都支持,无需降级。
input 事件里怎么取真实字数
对 <input type="text">,直接用 el.value.length 就是用户感知的字数——中文、英文、数字、标点、空格、换行符(如果支持)全算 1 字,符合绝大多数业务要求。别用 innerText 或 textContent,input 元素没有这些属性,强行读会返回 undefined。
常见错误写法:
el.innerText.length // ❌ input 元素无 innerText 属性 el.textContent.length // ❌ 同上,报错或返回 0
怎么防超限还保持光标位置
只靠 maxlength 属性不够:它拦不住粘贴超长内容,也不影响 JS 赋值。真要严控,得在 input 回调里截断,但必须手动保存/恢复光标位置,否则用户粘贴后光标跳到开头,体验极差。
- 用
el.selectionStart和el.selectionEnd记录当前光标范围 - 截断后先设
el.value = truncated,再恢复el.setSelectionRange(start, end) - 如果截断发生在光标之后,
start/end可能越界,需用Math.min(start, el.value.length)保护
显示计数器时容易漏掉的初始化和空指针
页面一加载就得显示 “0”,不能等第一次输入才更新;同时必须确保 DOM 元素存在,否则 Cannot set property 'textContent' of null 直接报错中断逻辑。
实操要点:
- JS 放在
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











