如何使用JavaScript获取<textarea>中的行数?

Mas*_*ask 25 html javascript textarea

我有一个<textarea>元素.我可以使用JavaScript来检测(例如)10行文本吗?

Mot*_*tie 37

好吧,我发现了一种更简单的方法,但你需要在CSS中设置textarea的行高.我试图读取脚本中的行高,ta.style.lineHeight但它似乎没有返回值.

CSS

#ta { width: 300px; line-height: 20px; }
Run Code Online (Sandbox Code Playgroud)

HTML

<textarea id="ta">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque suscipit, nisl eget dapibus condimentum, ipsum felis condimentum nisi, eget luctus est tortor vitae nunc. Nam ornare dictum augue, non bibendum sapien pulvinar ut. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras congue congue purus, quis imperdiet tellus ornare in. Nulla facilisi. Nulla elementum posuere odio ut ultricies. Nullam tempus tincidunt elit eget posuere. Pellentesque sit amet tellus sapien. Praesent sed iaculis turpis. Nam quis nibh diam, sed mattis orci. Nullam ornare adipiscing congue. In est orci, consectetur in feugiat non, consequat vitae dui. Mauris varius dui a dolor convallis iaculis.</textarea>
Run Code Online (Sandbox Code Playgroud)

脚本

 var taLineHeight = 20; // This should match the line-height in the CSS
 var taHeight = ta.scrollHeight; // Get the scroll height of the textarea
 ta.style.height = taHeight; // This line is optional, I included it so you can more easily count the lines in an expanded textarea
 var numberOfLines = Math.floor(taHeight/taLineHeight);
 alert( "there are " + numberOfLines + " lines in the text area");
Run Code Online (Sandbox Code Playgroud)

更新:感谢@Pebbl解决了这些错误,这是获取文本内容高度所需的代码(演示)

var calculateContentHeight = function( ta, scanAmount ) {
    var origHeight = ta.style.height,
        height = ta.offsetHeight,
        scrollHeight = ta.scrollHeight,
        overflow = ta.style.overflow;
    /// only bother if the ta is bigger than content
    if ( height >= scrollHeight ) {
        /// check that our browser supports changing dimension
        /// calculations mid-way through a function call...
        ta.style.height = (height + scanAmount) + 'px';
        /// because the scrollbar can cause calculation problems
        ta.style.overflow = 'hidden';
        /// by checking that scrollHeight has updated
        if ( scrollHeight < ta.scrollHeight ) {
            /// now try and scan the ta's height downwards
            /// until scrollHeight becomes larger than height
            while (ta.offsetHeight >= ta.scrollHeight) {
                ta.style.height = (height -= scanAmount)+'px';
            }
            /// be more specific to get the exact height
            while (ta.offsetHeight < ta.scrollHeight) {
                ta.style.height = (height++)+'px';
            }
            /// reset the ta back to it's original height
            ta.style.height = origHeight;
            /// put the overflow back
            ta.style.overflow = overflow;
            return height;
        }
    } else {
        return scrollHeight;
    }
}

var calculateHeight = function() {
    var ta = document.getElementById("ta"),
        style = (window.getComputedStyle) ?
            window.getComputedStyle(ta) : ta.currentStyle,

        // This will get the line-height only if it is set in the css,
        // otherwise it's "normal"
        taLineHeight = parseInt(style.lineHeight, 10),
        // Get the scroll height of the textarea
        taHeight = calculateContentHeight(ta, taLineHeight),
        // calculate the number of lines
        numberOfLines = Math.ceil(taHeight / taLineHeight);

    document.getElementById("lines").innerHTML = "there are " +
        numberOfLines + " lines in the text area";
};

calculateHeight();
if (ta.addEventListener) {
    ta.addEventListener("mouseup", calculateHeight, false);
    ta.addEventListener("keyup", calculateHeight, false);
} else if (ta.attachEvent) { // IE
    ta.attachEvent("onmouseup", calculateHeight);
    ta.attachEvent("onkeyup", calculateHeight);
}
Run Code Online (Sandbox Code Playgroud)

  • @Mottie很好:)如果你感兴趣我已经将一些自动调整大小的textarea逻辑与你的行数相结合,所以现在它应该是全面的 - 对于大多数浏览器 - 即使ta大于内容.http://jsfiddle.net/PfD7L/1/ (4认同)
  • +1,这是迄今为止最可靠的方法.注意:确保textarea以`rows = 1`开头,否则其'scrollHeight`可能是人为的高. (2认同)
  • 我有 lineHeight=20 和 textarea height=40,当我添加文本时,calculateContentHeight 返回 21, 41, 60, 80, 100. `(height++)+'px'` 需要替换为 `(++height)+'像素'` (2认同)

Sam*_*Elh 7

您可以从 中获取实际的文本高度Element.scrollHeight,但要获得正确的高度,必须有一个滚动,这意味着您可以暂时将文本框高度设置为0,直到获得滚动高度值然后恢复 CSS 高度。

你可以根据 CSS line-height 属性值(1 行文本贡献getComputedStyle(ref).lineHeight像素)来计算行数,类似于...

function getTextareaNumberOfLines(textarea) {
    var previous_height = textarea.style.height, lines
    textarea.style.height = 0
    lines = parseInt( textarea.scrollHeight/parseInt(getComputedStyle(textarea).lineHeight) )
    textarea.style.height = previous_height
    return lines
}
Run Code Online (Sandbox Code Playgroud)

注意:您的元素必须存在于 DOM 中才能获取scrollHeight、lineHeight 高度等。如果尚不存在,请添加它们,计算值,然后从 DOM 中删除它们。


小智 5

只需一行js:

var rows = document.querySelector('textarea').value.split("\n").length;
Run Code Online (Sandbox Code Playgroud)

  • 如果有几行不是因为换行符而是因为一行溢出到下一行怎么办? (37认同)

小智 5

假设您知道行高,最简单的方法是:

function numOfLines(textArea, lineHeight) {
    var h0 = textArea.style.height;
    ta.style.height = 'auto';
    var h1 = textArea.scrollHeight;
    textArea.style.height = h0;
    return Math.ceil(h1 / lineHeight);
}
Run Code Online (Sandbox Code Playgroud)

这里的技巧是将高度设置为auto第一个。然后,当您访问 scrollHeight 时,浏览器将进行布局并返回正确的高度,包括任何换行。然后将textarea高度恢复到原来的值,返回结果。


web*_*dan 0

您可以通过 Javascript DOM 访问该字段并简单地计算换行符的数量。

oArea = document.getElementById('myTextField');
var aNewlines = oArea.value.split("\n");
var iNewlineCount = aNewlines.length();
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于&lt;ENTER&gt;。如果文本自动换行,唯一的方法是使用固定大小的字体,计算所有字符,然后将它们除以一行中允许的字符。假设该过程中没有换行符... \n 有人吗?! (5认同)