Смотря что Вы считаете строками. Если реальные строки, то можно считать количество переводов строки, если видимые строки, то наверное без эмуляции не обойтись. Вот наглядный пример того и другого: codepen.io/iiil/pen/Ehpbc
В эмуляции Chrome покажет ошибку — он, сука такая, возвращает 'normal' для правила line-height. Есть подозрение, что Opera, Yandex и Safari сделают то же самое.
@Petroveg там есть еще одна проблема, если количество строк меньше допустимого в textarea, то считать соответственно будет неправильно.
Надо додумать на досуге. У Вас никаких идей?
Да вроде метод-то поддерживается с незапамятных времён. Так что единственный вопрос — производительность. То ли clientRects(), то ли расчёт высоты и деление (возможно, с округлением).
Терзают смутные сомнения, что для clientHeight задействуются механизмы, схожие с теми, что и при clientRects().
Так что для специфических задач getClientRects пойдёт, а для мелких и частых изменений состояния, возможно, лучше более примитивные. Безусловно, одна операция копеечная — даже в Chrome всего 2 мкс.
Кстати, на самом блоке getBoundingClientRect существенно быстрее (тот же 1 000 000 итераций):
200 мс [FF]
100 мс [Chrome]
Так что я ошибался с мыслью, что реализация client-, offset-, scroll- параметров так же затратна, как и определение областей элементов.
Есть способ при котором копируешь весь текст в отдельный span/div с такой же шириной, затем полученную высоту делишь на высоту строки - получаешь количество строк.
@EnterSandman Можно ввести фразу длинной в несколько тысяч символов и в зависимости от ширины textarea в результате может быть разное количество строк. При этом количество переводов строки при таком вводе равно нулю, так как пользователь не нажимал "ввод". Я имел ввиду такую ситуацию.