如何获得textarea中的行数?

时间:2010-01-10 02:53:02

标签: javascript jquery

我想要的是计算textarea中的行数,例如:

line 1
line 2
line 3
line 4

最多可以计4行。基本上按一次输入会转移到下一行

以下代码无效:

var text = $("#myTextArea").val();   
var lines = text.split("\r");
var count = lines.length;
console.log(count);

无论有多少行,它总是给出'1'。

16 个答案:

答案 0 :(得分:45)

使用“\ n”或“\ r \ n”的问题是它只计算返回的数量,如果你有一条很长的线可以换行,那么它就不会被计算为新行。这是获取行数的另一种方法 - 因此它可能不是最佳方式。

编辑(感谢alex):

脚本

$(document).ready(function(){
 var lht = parseInt($('textarea').css('lineHeight'),10);
 var lines = $('textarea').attr('scrollHeight') / lht;
 console.log(lines);
})

更新:这里有一个更全面的答案:https://stackoverflow.com/a/1761203/145346

答案 1 :(得分:27)

如果您只是想测试硬线返回,这将跨平台工作:

var text = $("#myTextArea").val();   
var lines = text.split(/\r|\r\n|\n/);
var count = lines.length;
console.log(count); // Outputs 4

答案 2 :(得分:19)

我已经将lines和lineCount方法实现为String原型:

String.prototype.lines = function() { return this.split(/\r*\n/); }
String.prototype.lineCount = function() { return this.lines().length; }

显然,split方法不会计算IE9中字符串末尾(或textarea的innerText属性)的回车符和/或换行符,但它会在Chrome 22中计算它,产生不同的结果。< / p>

到目前为止,当浏览器不是Internet Explorer时,我通过从行数中减去1来适应这一点:

String.prototype.lineCount = function() { return this.lines().length - navigator.userAgent.indexOf("MSIE") != -1); }

希望有人有更好的RegExp或其他解决方法。

答案 3 :(得分:9)

用户\n而不是\r

var text = $("#myTextArea").val();   
var lines = text.split("\n");
var count = lines.length;
console.log(count);

答案 4 :(得分:2)

如果拆分“\ n”呢?

如果一行包裹在textarea中的2行,也会出现问题。

要像这样准确地做到这一点,你可以使用固定高度的字体并测量像素。但这可能会有问题。

答案 5 :(得分:2)

此函数计算textarea中包含文本的行数:

function countLine(element) {
  var text = $(element).val();
  var lines = text.split("\n");
  var count = 0;
  for (var i = 0; i < lines.length-1; i++) {
    if (lines[i].trim()!="" && lines[i].trim()!=null) {
      count += 1;
    }
  }
  return count;
}

答案 6 :(得分:2)

但是,如果你需要使用它,这是有效的,因为它会回应你的问题

let text = document.getElementById("myTextarea").value;   
let lines = text.split(/\r|\r\n|\n/);
let count = lines.length;
console.log(count);

答案 7 :(得分:1)

正常的换行符是“\ n”。某些系统的惯例是事先也有“\ r”,因此在这些系统中,“\ r \ n”经常被认为是一个新的线。在浏览器中,除非用户通过从其他地方复制它而故意输入“\ r”,否则换行符可能只表示为“\ n”。在任何一种情况下,按“\ n”分割将计算行数。

答案 8 :(得分:1)

我使用了Mottie的原始答案,但在JQuery API中更改了一些功能。以下是当前API v3.1.0的工作函数:

{{1}}

所有人都为Mottie的回答而努力!

答案 9 :(得分:1)

对换行进行计数不是查找行数的可靠方法,因为长文本可能会折断并且仍然仅计为一行。 您要做的是找出文本区域的scrollHeight并将其除以单行的高度。

在这里详细回答: https://stackoverflow.com/a/1761203/9863305

答案 10 :(得分:0)

<html>
<head>
<script>
function countLines(theArea){
var theLines = theArea.value.replace((new RegExp(".{"+theArea.cols+"}","g")),"\n").split("\n");
if(theLines[theLines.length-1]=="") theLines.length--;
theArea.form.lineCount.value = theLines.length;
}
</script>
</head>
<body>
<form>
<textarea name="myText" onKeyUp="countLines(this)" cols="10" rows="10">
</textarea>
<br>
Lines:
<input type=text name="lineCount" size="2" value="0">
</form>
</body>
</html>

答案 11 :(得分:0)

你的回答可以用非常简单的方式完成。

var text = $("#myTextArea").val();

               // will remove the blank lines from the text-area
                text = text.replace(/^\s*[\r\n]/gm, "");

               //It will split when new lines enter
                var lines = text.split(/\r|\r\n|\n/);

             var count = lines.length; //now you can count thses lines.
                console.log(count);

此代码用于填写textarea中的确切行。 并且肯定会工作。

答案 12 :(得分:0)

这将旨在考虑具有硬性收益和软性收益的生产线:

    //determine what the fontsize will be
    let fontsize = 12;
    //get number of characters that can fit in a row
    let charsperrow = textarea.clientWidth / fontsize;
    //get any hard returns
    let hardreturns = textarea.textContent.split(/\r|\r\n|\n/);
    let rows = hardreturns.length;
    //loop through returns and calculate soft returns
    for(let i = 0,len = rows; i < len; i++){
        let line = hardreturns[i];
        let softreturns = Math.round(line.length / charsperrow);
        //if softreturns is greater than 0, minus by 1 (hard return already counted)
        softreturns = Math.round(softreturns > 0 ? (softreturns - 1) : 0);
        rows += softreturns;
    }
    console.log(Math.round(rows));

答案 13 :(得分:0)

您可以使用具有属性contenteditable="true"的div来代替textarea。在具有此属性的div上,您可以编写任何内容,就像在textarea中一样,但是任何新行(第一行除外)都自动包装在div内。您可以使用jQuery或JS来计算div的数量并添加+1,这是第一行。

这是没有道理的,我会在任何场合都使用它而不是textarea。它有几个优点。它会自动调整大小,您可以轻松计算空白行,可以自定义每个div或使用颜色或字体大小或任何其他内容添加跨度,可以使用任何line-height和任何font-size,还可以添加富文本功能还有更多,这对于SEO和其他功能来说更好。这是jQuery的工作示例:

    $("#Editor").on("keyup mouseup", function(){
        blankSpace = $(this).find("br").length; //count blank lines
        urlCounter = $(this).find("div").length + 1 - blankSpace;

        $(".lineCounter").text("Number of links: "+ urlCounter);
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="Editor" contenteditable="true" style="color:aqua;width: 100%;height: 100%;background: blue;"></div>
<div class="lineCounter" style="position: absolute;bottom: 0;z-index: 999;left: 0;"></div>

答案 14 :(得分:0)

尝试在每次更改其值时调用此函数。

 textArea.addEventListener('input', function() {
        setDynamicHeight();
 });

 function setDynamicHeight() {
    textArea.style.height = 0; // set the height to 0 in case of it has to be shrinked
    textArea.style.height = textArea.scrollHeight + 'px'; // set the dynamic height
}

答案 15 :(得分:0)

let count = 0
const a = document.querySelector('textarea')
for (let i = 0; i < a.value.length; i++) {
  if (a[i] == '\n') {
    count++
  }
}
console.log(count)