Input с ограничением слов

Как сделать текстовой input с ограничением слов? только 10 или только 18? Мои попытки смогли добиться только такого результата

(function () {
  var max = 5,
    count = 0,
    input = null,
    result = null;

  function init() {
    input = document.querySelector('#inp');
    result = document.querySelector('#count');

    input.addEventListener('keyup', keyup);
  }

  function keyup(e) {
    if ((count = getNumOfComma(this.value)) >= max) {
      result.innerHTML = '<strong>MAX WORDS</strong>'; // Лимит превышен
    } else {
      result.innerHTML = count; // sd
    }
  }

  function getNumOfComma(value) {
    var ch, i = 0;

    for (ch in value) {
      ch = value[ch];

      if (ch == ' ' || ch == ' ')
        i++;
    }

    return i;
  }

  document.addEventListener('DOMContentLoaded', init);
}());
<input type="text" class="input-words" placeholder="Буквы английского алфавита" id="inp"/>
<span id="count">0</span>


Ответы (2 шт):

Автор решения: Zhihar

Я бы сделал таким образом:

т.е. считал бы первые разделители после слов, для чего проверял бы текущую букву и предыдущую и если текущая является разделителем, а предыдущая - нет, значит это разделитель слов

чтобы получать верное число слов предыдущий символ перед проверкой надо сделать разделителем, а в конце текста из поля ввода добавить разделитель (иначе последнее слово не будет подсчитываться в некоторых случаях)

кроме того, поскольку возможных разделителей много, то я бы создал массив разделителей и искал бы совпадение в нем

const input = document.querySelector('#field');

input.addEventListener('input', updateValue);

oldText = input.value;

function updateValue(e) {

    // подсчитать кол-во слов
    const seperators = [' ', '.', ','];
    
    let wordsCount = 0;
    let lastLetter = ' ';

    for (let letter of e.target.value + " ") {

        if (seperators.includes(letter) && !seperators.includes(lastLetter)) {
            wordsCount ++;
        }
        
        lastLetter = letter;
    }

    // сформировать условие ввода текста в поле ввода
    const isCorrect = (wordsCount <= 8);

    // если текст введён некорректный, вернуть старый текст
    if (isCorrect == true) {
//        input.value = e.target.value;
        oldText = e.target.value;
    }
    else {
        input.value = oldText;
    }
}
#field {
    width: 90%;
}
<input id = 'field' value = 'Введено несколько    слов.Наверное'></input>

→ Ссылка
Автор решения: Фарид Ахмедов

Как вариант:

const MAX_WORDS = 4;

document.querySelector('input').addEventListener('keydown', (event) => {
  if (event.target.value.split(/\W+/).length > MAX_WORDS) {
    if (event.key.length === 1) {
      event.preventDefault()
    }
  } 
})
<input />

→ Ссылка