You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现textarea单词计数器首字符触发计数的问题

解决方法

原代码的计数逻辑是统计单词末尾的分隔符,只有输入空格/换行、单词结束时才会累加,因此未输入分隔符的首个单词不会被统计。改成统计单词起始位置即可,输入第一个有效字符时就会触发计数,同时兼容空格、换行两种分隔场景。

核心计数代码

全程使用基础循环和字符判断,不需要额外掌握新语法:

let wc = 0;
for (let i = 0; i < text.length; i++) {
  // 仅当当前字符是有效内容(非空格、非换行)时,才判断是否为新单词
  if (text[i] !== ' ' && text[i] !== '\n') {
    // 满足两个条件之一即为新单词:1. 是文本第一个字符;2. 前一个字符是分隔符
    if (i === 0 || text[i - 1] === ' ' || text[i - 1] === '\n') {
      wc++;
    }
  }
}

场景适配说明

  • 输入第一个字母时:i=0 满足首字符规则,计数立刻变为1
  • 换行分隔单词时:新行首个字符的前一位是\n,自动完成累加
  • 存在连续空格、开头/末尾留空:不会重复计数
  • 最后一个单词后不输入空格/换行:单词开头时已经完成计数,不会漏算

实时触发完整示例

将计数逻辑绑定到textarea的input事件上,即可实现输入即更新,同时通过原生属性限制140字符上限:

<textarea maxlength="140" id="text-area"></textarea>
<p>单词总数:<span id="word-count">0</span></p>

<script>
  const textarea = document.getElementById('text-area');
  const countLabel = document.getElementById('word-count');

  function calculateWordCount(text) {
    let wc = 0;
    for (let i = 0; i < text.length; i++) {
      if (text[i] !== ' ' && text[i] !== '\n') {
        if (i === 0 || text[i - 1] === ' ' || text[i - 1] === '\n') {
          wc++;
        }
      }
    }
    return wc;
  }

  // 每次输入自动重新计算
  textarea.addEventListener('input', () => {
    countLabel.textContent = calculateWordCount(textarea.value);
  });
</script>

关于split方法的补充

你之前使用split(" ")无法适配换行,是因为仅把空格设为了分隔符。如果后续接受数组相关写法,可以先把换行统一替换为空格再切割,过滤空值后取长度即可:

// 可选简化写法:先替换全量换行,再按空格切割,过滤连续空格产生的空项
const wc = text.replace(/\n/g, ' ').split(' ').filter(item => item).length;

内容的提问来源于stack exchange,提问作者Sgambe33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 06:54:04