Pixiv - KiraraShss
662 字
3 分钟
关于事件类型focus和input
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
- 关于事件类型focus和input
写在 focus 事件里之所以不行(或者说达不到实时更新效果),是因为 focus 事件是一次性的。
原因解释
-
触发时机不同:
focus事件:只有当你的鼠标点击文本框,或者文本框获得光标的那一瞬间才会触发。代码执行完这一遍就不再执行了。input事件:每当你输入一个字、删除一个字,或者粘贴内容时,只要文本框的内容发生了变化,它就会持续触发。
-
现象:
- 如果你把统计字数的代码写在
focus里,只有当你刚点进框里时,它会统计一次当前字数。 - 当你开始打字时,因为没有触发新的事件,字数统计就不会变了。
- 如果你把统计字数的代码写在
解决方法
你应该使用 input 事件来实现实时统计。你代码下方注释掉的那部分其实就是正确的做法。
我帮你把代码修改过来,启用 input 事件监听:
const textarea = document.querySelector('#tx'); const total = document.querySelector('.total');
textarea.addEventListener('focus', () => { total.style.opacity = 1; // 聚焦时也需要更新一次,防止页面刷新后内容还在但字数没显示 const val = textarea.value; total.textContent = `${val.length}/200字`; });
textarea.addEventListener('blur', () => { total.style.opacity = 0; });
// 这里才是实时输入更新字数的关键 textarea.addEventListener('input', () => { const val = textarea.value; total.textContent = `${val.length}/200字`; });我将为你移除注释,启用 input 事件。
写在 focus 事件里之所以不行,是因为 focus 事件只会在文本框“获得焦点”的那一瞬间触发一次。
当你点击文本框开始输入时:
- 触发
focus:代码执行一次,统计了当前字数(比如 0/200)。 - 开始打字:你输入内容时,
focus事件已经结束了,它不会监测后续的输入行为,所以字数不会随着你的打字而更新。 - 什么是正确的:你需要用
input事件。input事件会在用户每次输入、删除文本内容时触发,非常适合用来实时监测输入的字数。
我已经帮你取消了代码中 input 部分的注释,现在字数统计功能应该可以正常使用了。
修改后的代码逻辑如下(供参考):
// 获得焦点时,仅显示统计文字(不需要重复计算,input 会接管) textarea.addEventListener('focus', () => { total.style.opacity = 1; });
textarea.addEventListener('blur', () => { total.style.opacity = 0; });
// 关键点:使用 input 事件实时监听内容变化 textarea.addEventListener('input', () => { const val = textarea.value; total.textContent = `${val.length}/200字`; });赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
最后更新于 2026-02-05,距今已过 43 天
部分内容可能已过时