Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   В текстареа нужно подсчитать количество строк (https://javascript.ru/forum/events/41085-v-tekstarea-nuzhno-podschitat-kolichestvo-strok.html)

george115 30.08.2013 20:28

В текстареа нужно подсчитать количество строк
 
В текстареа нужно подсчитать количество строк.
Код
finalcode = code.value; //code получает текстареа
var lines = finalcode.split('\n').length;
работает для подсчетов переходов а не строк

rekzi 31.08.2013 23:51

Есть варианты в сети, но не универсальные (с багами). Мне кажется нужно создавать отдельный div c шириной равной textarea и высотой определяемой содержимым. Вычислять количество строк через высоты строк и блока div, предварительно настроив css (можно наверно и без этого). А блок выводить за пределами видимой страницы. А можно идти по каждой букве в textarea окружая ее каким-то тэгом и определять Y положения этого тэга. Каждый скачок Y и будет определять новую строку.

Яростный Меч 01.09.2013 02:19

Можно использовать getClientRects.

набросок: http://jsfiddle.net/wCyJt/

его, конечно, надо допиливать. в частности, для спана выставить правильный фонт (оный получить от текстареа так )

bes 01.09.2013 11:31

Цитата:

Сообщение от george115
В текстареа нужно подсчитать количество строк.
Код
finalcode = code.value; //code получает текстареа
var lines = finalcode.split('\n').length;
работает для подсчетов переходов а не строк

каких строк?
если есть переход появляется новая строка
или ты хочешь учитывать только строки, в которых есть хотя бы один символ?

BETEPAH 02.09.2013 12:40

Условиями задачи позволяется выставить моноширинный шрифт для текстареа?

george115 02.09.2013 14:13

спасибо. но печатаю много символов, дальше пишет один

george115 02.09.2013 14:14

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

george115 02.09.2013 14:15

не имеет значения какой шрифт)

BETEPAH 02.09.2013 15:15

Цитата:

Сообщение от george115 (Сообщение 270464)
не имеет значения какой шрифт)

Выставьте моноширинный шрифт, посчитайте сколько символов помещается на строке (N) и после .split('\n') элементы полученного массива, которые длиннее N, делите на слова и группируете по строкам.
На пальцах:
Допустим, N = 10
"В этом поле содержится множество букв
кроме
того
цифры тоже есть"

Получаем два длинных абзаца, которые нужно обработать, и два коротких.
В первом, получаем группировку по строкам "В этом ", "поле ", "содержится", "множество ", "букв" - итого 5 строк.
В последнем абзаце получим еще две строки.
Всего получилось 5 + 1 + 1 + 2 = 9 строк.

Яростный Меч 02.09.2013 15:38

Чуть допилил свой вариант, а то Хром неадекватно считал переносы

http://jsfiddle.net/DN6R7/

рони 02.09.2013 16:45

Вариант ... источник изменение размера textarea
добавил только вывод количества строк в прежний код
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>изменение размера textarea</title>
<style type="text/css">
body {
background-color:#004B52;
}
textarea{
  background-color: #FF0000;
  color:yellow;
  font-size: medium;
}
div{
  color: #FFFFFF;
  display: inline-block;
  padding: 5px;
}

</style>
<script language="JavaScript" type="text/javascript">
function flexibleTextarea(b) {
    var a = document.getElementById(b) || b;
    if (a) {
        a.style.overflow = "hidden";
        a.cols = a.cols > 0 ? a.cols : 20;
        var c = a.rows = a.rows > 0 ? a.rows : 2;
        a.rows = 1;
        b = -1;
        var f = a.value;
        for (a.value = ""; a.scrollHeight <= a.clientHeight && a.scrollWidth <= a.clientWidth;) {
            a.value += "0";
            b++
        }
        a.value = f;
        a.rows = c;
        var g = RegExp("([^\r\n]{" + b + "})([^\r\n])");
        a.onkeyup = a.onkeydown = function () {
            a.value = a.value.replace(g, "$1\r\n");
            for (var d = 1, e = a.value; e.search(/\r?\n/) > -1;) {
                d++;
                e = e.replace(/\r?\n/, "")
            }
            a.rows = d < c ? c : d;
            document.getElementById("show").innerHTML =  a.rows
        }
    }
};
window.onload = function(){
flexibleTextarea('textarea');
}
</script>
</head>
<body>
<textarea id='textarea'   rows="3"    cols="50" ></textarea><div id="show">3</div>
<br />
</body>
</html>

BETEPAH 02.09.2013 16:55

Вложений: 1
Цитата:

Сообщение от Яростный Меч (Сообщение 270474)
Чуть допилил свой вариант, а то Хром неадекватно считал переносы
http://jsfiddle.net/DN6R7/

>>но мне еще нужно учитовать когда строка появляеться после написания длиной строки, и делаеться переход автоматически - орфография автора

Яростный Меч 02.09.2013 17:04

да, точно.
совсем забыл ворд-врап

http://jsfiddle.net/4tdks/


Часовой пояс GMT +3, время: 02:48.