Поискав в гугле и на хабре не нашел полностью готового и устраивающего меня решения, пришлось собирать из того что нашел. Вот что получилось в итоге:

Проверку длины решил осуществлять на следующих этапах:
  • нажатие клавиши
  • вставке из буфера обмена
  • завершение редактирования textarea




<textarea id="testArea" name="testArea" onkeypress="return onTextAreaKeyPress(this, event)" onpaste="return onTextAreaPaste(this, event)" onchange="onTextAreaChange(this)" />


Событие onchange пришлось обрабатывать, поскольку не все браузеры по умолчанию поддерживают работу с буфером обмена из javascript.
Думаю код не слишком сложный и дополнительных пояснениях не требует, поэтому много комментариев не делал.