Простой счётчик слов на HTML, CSS и JavaScript

К чему это пригодится
Небольшая утилита для подсчёта слов полезна при создании редакторов, форм с ограничением длины, тестовых заданий и учебных проектов. Код легко расширять — добавлять подсчёт символов, лимиты, хранение истории и интеграцию с бекендом.
Что вы получите в этой статье
- Пошаговый пример интерфейса и связанного JavaScript.
- Рабочий код для подсчёта слов, учитывающий обычные крайние случаи.
- Советы, когда простая реализация не подойдёт, и альтернативы.
- Чек-листы, тест-кейсы и критерии приёмки.
Как создать интерфейс счётчика слов
Чтобы сделать интерфейс, добавьте на простую HTML-страницу элемент textarea, кнопку и место для вывода результата.
- Создайте файл index.html.
- Добавьте базовую структуру веб-страницы:
Word Counter Count Words
- Внутри контейнера под заголовком добавьте textarea:
- Под textarea добавьте кнопку:
- Добавьте блок для отображения результата:Words: 0
- В той же папке создайте файл styles.css.
- Заполните CSS простыми стилями:
body { margin: 0; padding: 0; background-color: #f0fcfc; } * { font-family: "Arial", sans-serif; } .container { padding: 100px 25%; display: flex; flex-direction: column; line-height: 2rem; font-size: 1.2rem; color: #202C39; } textarea { padding: 20px; font-size: 1rem; margin-bottom: 40px; } button { padding: 10px; margin-bottom: 40px; } - Подключите CSS в head:
- Откройте index.html в браузере, чтобы протестировать интерфейс.

Как правильно считать слова внутри textarea
Простой подход — разделить строку по пробелу: str.split(“ “).length — но у него есть ограничения (много пробелов, переносы строк, знаки препинания). Ниже — несколько реалистичных шагов и разбор ошибок.
- Создайте script.js в той же папке.
- Подключите его перед закрывающим тегом body:
- Получите элементы по id:
let input = document.getElementById("input"); let button = document.getElementById("count-button"); let wordCountResult = document.getElementById("word-count-result"); - Добавьте обработчик клика:
button.addEventListener("click", function() { }); - Внутри обработчика получите введённый текст:
let str = input.value; - Простая реализация (из исходного примера):
let wordsList = str.split(" "); let count = wordsList.length; wordCountResult.innerHTML = count;
Этот код работает для простых случаев, но считает лишние пустые элементы, если в тексте есть двойные пробелы или переносы строки.
Улучшенная реализация (рекомендованная)
Используйте trim() и разделение по любым пробельным символам с помощью регулярного выражения. Это убирает начальные/концевые пробелы и корректно обрабатывает последовательности пробелов и переносов строк.
// script.js — улучшенная версия
let input = document.getElementById("input");
let button = document.getElementById("count-button");
let wordCountResult = document.getElementById("word-count-result");
button.addEventListener("click", function() {
let str = input.value || ""; // безопасно, если поле пустое
// Убираем начальные и конечные пробелы и разделяем по любым пробельным символам
let words = str.trim().split(/\s+/).filter(Boolean);
// Если строка была пустой (только пробелы), filter вернёт пустой массив
let count = words.length;
wordCountResult.textContent = count;
});Пояснения: trim() удаляет пробелы в начале/конце; /\s+/ матчит один или более пробельных символов (включая табы и переносы строк); filter(Boolean) дополнительно убирает пустые строки.
Как учитывать пунктуацию и специальные случаи
- Для большинства задач достаточно разделения по пробельным символам. Но если нужно убрать знаки препинания из слов (например, считать “hello,” как “hello”), примените предобработку:
let cleaned = str.replace(/["'“”()\[\],.:;!?—–]/g, ""); let words = cleaned.trim().split(/\s+/).filter(Boolean); - Для языков с особыми токенами (китайский, японский) простое split не подойдёт — требуется сегментация на слова, использующая словари или библиотеки.
Как использовать пример
- Откройте index.html в браузере.

- Введите текст в textarea.

- Нажмите кнопку “Count Words” — число обновится.

Когда простая реализация даёт неверные результаты (примеры и обходы)
- Многоразовые пробелы и переносы строк: простой split(“ “) вернёт пустые элементы. Решение: trim() + split(/\s+/).
- Пунктуация, кавычки, скобки: если не очищать, они остаются в словах. Решение: удалить пунктуацию перед split или применять более точную токенизацию.
- Слова с дефисом и апострофом: “self-employed” или “don’t” — решайте политикой: считать как одно слово или два. Для одного слова не удаляйте дефис и апостроф.
- Языки без пробелов (китайский, японский): нужен специализированный разбор.
Альтернативные подходы
- Использовать библиотеку для токенизации (например, для сложных языков или NLP-задач).
- Подсчёт слов на сервере — если нужно учитывать словари, пользовательские правила и хранение статистики.
- Подсчёт символов вместо слов — полезно, когда ограничение по символам важнее (SMS, твиты).
Критерии приёмки
- Поле ввода принимает произвольный текст и не падает при вводе больших объёмов.
- Нажатие кнопки даёт корректный числовой результат.
- Пустая строка и строка из пробелов дают 0 слов.
- Текст с переносами строк и табуляцией корректно считается.
- Пунктуация не приводит к созданию пустых элементов в результате.
Тестовые случаи (acceptance)
- Пустая строка -> 0
- “Hello world” -> 2
- “ Hello world “ (много пробелов) -> 2
- “Line1\nLine2” -> 2
- “end.” -> 1 (если не очищаем пунктуацию) или 1 (если очищаем пунктуацию)
- “don’t stop” -> 2 (если апостроф не удалять)
- Долгий текст (10 000+ символов) — приложение не должно тормозить существенно
Чек‑лист ролей
- Разработчик: реализовать trim + split(/\s+/) + filter(Boolean), написать unit‑тесты.
- QA: пройти тестовые случаи, проверить производительность и корректность на краевых данных.
- Ревьюер: убедиться, что код читабелен и нет уязвимостей (XSS не влияет на внутренний подсчёт, но вывод в DOM должен использовать textContent).
Шпаргалка / Snippets
- Самый простой подсчёт (не рекомендуется для продакшена):
let count = input.value.split(" ").length; - Надёжный короткий вариант:
let count = input.value.trim().split(/\s+/).filter(Boolean).length; - Удалить базовую пунктуацию и посчитать:
let cleaned = input.value.replace(/["'“”()\[\],.:;!?—–]/g, ""); let count = cleaned.trim().split(/\s+/).filter(Boolean).length;
Краткий глоссарий
- token: единица текста, обычно слово.
- split: метод строки для разделения по разделителю.
- trim: удаление пробелов в начале и конце строки.
Безопасность и доступность
- Выводите результат через textContent или innerText, а не через innerHTML, чтобы не рендерить HTML, введённый пользователем.
- Добавьте aria-атрибуты для кнопки и поля, если требуется доступность.
Заключение
Счётчик слов — простой, но полезный проект для практики JavaScript и работы с DOM. Начните с реализации trim() + split(/\s+/), добавьте тесты и улучшайте поведение для конкретных языков или требований. Это отличная отправная точка для расширения: лимиты, подсказки пользователю и аналитика.
Важно: если вы планируете поддержку языков без пробелов, используйте специализированные токенизаторы или библиотеки NLP.
Краткое резюме:
- Создайте index.html, styles.css и script.js.
- Используйте trim() + split(/\s+/) для надёжного подсчёта.
- Тестируйте на краевых случаях и добавляйте очистку пунктуации по необходимости.
Похожие материалы
Градиенты в Canva: добавить и настроить
Ошибка Disabled accounts can't be contacted в Instagram
Генерация случайных чисел в Google Sheets
Прокручиваемые скриншоты в Windows 11
Как установить корпусной вентилятор в ПК