Поиск количества строк в текстовом поле html
Я пишу мобильное веб-приложение, в котором полосы прокрутки не отображаются в браузере устройства. Из-за этого я пытаюсь динамически изменять высоту текстового поля, чтобы сделать его более крупным, однако я не знаю, каким образом можно получить количество строк в html textarea. Любая помощь будет принята с благодарностью!
ИЗМЕНИТЬ
Итак, теперь я понимаю, что это не новые строки как таковые, а фактическая перенос строк. Поэтому, когда заканчивается одна строка, он переносит текст на следующую строку. Кажется, это новая строка. Любой способ подсчитать их количество? Спасибо!
Ответы
Ответ 1
Я не пробовал использовать функцию, обсуждаемую в этом блоге, но вы можете найти ее полезной.
http://kirblog.idetalk.com/2010/03/calculating-cursor-position-in-textarea.html
В принципе, если вы создаете div
, а затем скопируете текст в этот div с теми же характеристиками ширины и шрифта, вы можете получить необходимую информацию, например, количество строк. Количество строк в этом примере было бы легким, так как если бы вы знали, сколько пикселей было бы высоким для одной строки, тогда просто найдите ширину тестового div, и вы можете получить довольно точную идею о том, сколько строк находится в ваш textarea
.
Ответ 2
Число строк в текстовом поле будет
textarea.value.match(/\n/g).length + 1
Ответ 3
Я создал плагин для обработки подсчета строк и обертки в <textarea>
.
Я надеюсь, что кто-то сможет его использовать.
Код в BitBucket
Использование образца
var result = $.countLines("#textarea");
result.actual // The number of lines in the textarea.
result.wraps // The number of lines in the textarea that wrap at least once.
result.wrapped // The total number of times all lines wrap.
result.blank // The number of blank lines.
result.visual // The approximate number of lines that the user actually sees in the textarea
Рабочая демонстрация
/*! Textarea Line Count - v1.4.1 - 2012-12-06
* https://bitbucket.org/MostThingsWeb/textarea-line-count
* Copyright (c) 2012 MostThingsWeb (Chris Laplante); Licensed MIT */
(function($) {
$.countLines = function(ta, options) {
var defaults = {
recalculateCharWidth: true,
charsMode: "random",
fontAttrs: ["font-family", "font-size", "text-decoration", "font-style", "font-weight"]
};
options = $.extend({}, defaults, options);
var masterCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
var counter;
if (!ta.jquery) {
ta = $(ta);
}
var value = ta.val();
switch (options.charsMode) {
case "random":
// Build a random collection of characters
options.chars = "";
masterCharacters += ".,?!-+;:'\"";
for (counter = 1; counter <= 12; counter++) {
options.chars += masterCharacters[(Math.floor(Math.random() * masterCharacters.length))];
}
break;
case "alpha":
options.chars = masterCharacters;
break;
case "alpha_extended":
options.chars = masterCharacters + ".,?!-+;:'\"";
break;
case "from_ta":
// Build a random collection of characters from the textarea
if (value.length < 15) {
options.chars = masterCharacters;
} else {
for (counter = 1; counter <= 15; counter++) {
options.chars += value[(Math.floor(Math.random() * value.length))];
}
}
break;
case "custom":
// Already defined in options.chars
break;
}
// Decode chars
if (!$.isArray(options.chars)) {
options.chars = options.chars.split("");
}
// Generate a span after the textarea with a random ID
var id = "";
for (counter = 1; counter <= 10; counter++) {
id += (Math.floor(Math.random() * 10) + 1);
}
ta.after("<span id='s" + id + "'></span>");
var span = $("#s" + id);
// Hide the span
span.hide();
// Apply the font properties of the textarea to the span class
$.each(options.fontAttrs, function(i, v) {
span.css(v, ta.css(v));
});
// Get the number of lines
var lines = value.split("\n");
var linesLen = lines.length;
var averageWidth;
// Check if the textarea has a cached version of the average character width
if (options.recalculateCharWidth || ta.data("average_char") == null) {
// Get a pretty good estimation of the width of a character in the textarea. To get a better average, add more characters and symbols to this list
var chars = options.chars;
var charLen = chars.length;
var totalWidth = 0;
$.each(chars, function(i, v) {
span.text(v);
totalWidth += span.width();
});
// Store average width on textarea
ta.data("average_char", Math.ceil(totalWidth / charLen));
}
averageWidth = ta.data("average_char");
// We are done with the span, so kill it
span.remove();
// Determine missing width (from padding, margins, borders, etc); this is what we will add to each line width
var missingWidth = (ta.outerWidth() - ta.width()) * 2;
// Calculate the number of lines that occupy more than one line
var lineWidth;
var wrappingLines = 0;
var wrappingCount = 0;
var blankLines = 0;
$.each(lines, function(i, v) {
// Calculate width of line
lineWidth = ((v.length + 1) * averageWidth) + missingWidth;
// Check if the line is wrapped
if (lineWidth >= ta.outerWidth()) {
// Calculate number of times the line wraps
var wrapCount = Math.floor(lineWidth / ta.outerWidth());
wrappingCount += wrapCount;
wrappingLines++;
}
if ($.trim(v) === "") {
blankLines++;
}
});
var ret = {};
ret["actual"] = linesLen;
ret["wrapped"] = wrappingLines;
ret["wraps"] = wrappingCount;
ret["visual"] = linesLen + wrappingCount;
ret["blank"] = blankLines;
return ret;
};
}(jQuery));
result = jQuery.countLines("#textarea");
jQuery('#display').html(
'<span>Actual: ' + result.actual + '</span>' +
'<span>Blank: ' + result.blank + '</span>' +
'<span>Visual: ' + result.visual + '</span>' +
'<span>Wrapped: ' + result.wrapped + '</span>' +
'<span>Wraps: ' + result.wraps + '</span>'
);
#textarea {
width: 150px;
height: 80px;
}
#display span {
display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="textarea">text
here
this is a longer line so that it will wrap in the box longer longer longer</textarea>
<div id="display"></div>
Ответ 4
Получить scrollHeight, вычесть верхнее + нижнее дополнение, разделить по строкеHeight.
Ответ 5
Это эффективный и точный метод подсчета количества строк в текстовой области, включая завернутые строки.
/** @type {HTMLTextAreaElement} */
var _buffer;
/**
* Returns the number of lines in a textarea, including wrapped lines.
*
* __NOTE__:
* [textarea] should have an integer line height to avoid rounding errors.
*/
function countLines(textarea) {
if (_buffer == null) {
_buffer = document.createElement('textarea');
_buffer.style.border = 'none';
_buffer.style.height = '0';
_buffer.style.overflow = 'hidden';
_buffer.style.padding = '0';
_buffer.style.position = 'absolute';
_buffer.style.left = '0';
_buffer.style.top = '0';
_buffer.style.zIndex = '-1';
document.body.appendChild(_buffer);
}
var cs = window.getComputedStyle(textarea);
var pl = parseInt(cs.paddingLeft);
var pr = parseInt(cs.paddingRight);
var lh = parseInt(cs.lineHeight);
// [cs.lineHeight] may return 'normal', which means line height = font size.
if (isNaN(lh)) lh = parseInt(cs.fontSize);
// Copy content width.
_buffer.style.width = (textarea.clientWidth - pl - pr) + 'px';
// Copy text properties.
_buffer.style.font = cs.font;
_buffer.style.letterSpacing = cs.letterSpacing;
_buffer.style.whiteSpace = cs.whiteSpace;
_buffer.style.wordBreak = cs.wordBreak;
_buffer.style.wordSpacing = cs.wordSpacing;
_buffer.style.wordWrap = cs.wordWrap;
// Copy value.
_buffer.value = textarea.value;
var result = Math.floor(_buffer.scrollHeight / lh);
if (result == 0) result = 1;
return result;
}
Демо здесь
Ответ 6
Я уверен, что нет разумного способа подсчета количества строк, отображаемых в браузере, особенно учитывая, что некоторые браузеры (Safari) позволяют пользователю изменять размеры текстовых полей.
Это было бы взломано, но лучше всего было бы просто оценить, исходя из общего количества символов, деленного на среднее число символов в строке.: -/
Ответ 7
Может быть, есть способ получить "сырое" количество "визуальных" строк. Вы должны прочитать свойство scrollHeight
текстового поля и разделить его на высоту строки. Попробуйте.
Начните с этого HTML:
<textarea id="ta" cols="50" rows="10"></textarea>
Тогда:
var line_height = Math.floor($("#ta").height() / parseInt($("#ta").attr("rows")));
var dirty_number_of_lines = Math.ceil($("#ta")[0].scrollHeight / line_height);
Я не уверен, действительно ли это работает, просто безумная теория.
Ответ 8
Вы можете рассчитать так:
var length = $('#textarea').val().split("\n").length;
Ответ 9
Количество символов, разрешенных для каждой строки, определяется атрибутом "cols" в текстовом поле.
<textarea rows="10" cols="80"></textarea>
Предполагая 80 символов в строке, хорошая оценка может быть:
var approxNumLines = textareaElement.value.length / textareaElement.cols ;
Не учитывается слово-разрыв и перенос слов.