【问题标题】:Counting textarea rows, display, increase, decrease计算textarea行数,显示,增加,减少
【发布时间】:2015-07-24 19:23:19
【问题描述】:

我正在尝试使用纯 javascript 计算 textarea 行,但我不确定为什么我的 selector.rows 没有返回正确的行数 :( 这是我的 js:

var selector = document.querySelectorAll("textarea");

for(i = 0; i < selector.length; i++){
   var array = selector[i];
   var count = array.rows;
   console.log(array, count);
   if(count > 1 &&  count.scrollHeight < count.offsetHeight){
       count--
       console.log(array.rows);
   }else{
       count++
       console.log(array.rows);
   }
}

jsFiddle:

【问题讨论】:

  • 它在 chrome 中工作。
  • @Grimbode 不,不工作......
  • 你想获取文本框的行数吗?或文本框内的文本占据的行数?您的代码适用于第一个代码(返回 textarea 中属性 rows 的值)
  • 该代码中有(至少)一个错误:变量count 是一个数字,而不是一个对象/元素。您不能将scrollHeightoffsetHeight 应用于它,它会为这些值返回undefined。这将使条件始终通过else。您应该改用 array 变量:array.scrollHeightarray.offsetHeight
  • 好。我找到了一个解决方案,我正在写它作为答案。我会尽快发布的

标签: javascript html rows


【解决方案1】:

上面的代码运行良好,因为它旨在返回textbox 显示的行数(textarea 的属性rows)。但是您想要textarea 中的文本占用的行数,这里有一个解决方案:

  1. 获取textarea的height(我用getComputedStyle(),因为高度没有定义)
  2. 针对textarea 中的内容计算line-height(= 高度/行数)。
  3. 获取textareascrollHeight
  4. 通过将scrollHeight 除以计算得出的line-height 来计算行数。

应该是这样的:

var selector = document.querySelectorAll("textarea");

for(i = 0; i < selector.length; i++){
    
    var txtarea = selector[i];
    var count = txtarea.rows;
    
    // get the textarea height
    var cs = window.getComputedStyle(txtarea, null);
    var tHeight = parseInt(cs.getPropertyValue("height"));
  
    // calculate the line-height
    var tLineHeight = tHeight / count;
  
    // calculate the number of rows in the textarea
    var tRows = Math.round(txtarea.scrollHeight / tLineHeight);
  
    document.getElementById("results").innerHTML += "ROWS = " + tRows + "<br>";
    
}//end for
<textarea rows="4" cols="40">
 Lorem ipsum dolor sit amet, eam ex bonorum scripserit. Audire diceret delectus ex usu. Sonet alienum duo id. Elit delenit pro ex, quo case honestatis eloquentiam ea, everti detracto intellegat no nam. Pro quodsi euismod qualisque ei. Est et modus porro, eam solet gubergren ea.

In soleat eleifend per, no per nibh mollis labitur. Sit ei possim molestiae, ius antiopam principes ei. Ea eam soleat fierent. Mel et quod veri convenire, vis no modus oporteat posidonium. Dicunt viderer vocibus his te, qui agam iriure pertinacia te. In sit homero facilisi iudicabit. Timeam eligendi sed an.


</textarea>

<textarea rows="4" cols="40">
 Hello
</textarea>

<div id="results"></div>

您还可以在 JSFiddle 的变体中看到它:http://jsfiddle.net/qxKmW/46/(在这种情况下,请检查控制台日志)


此解决方案的一个问题:它将返回这两个中的较高值:

  • textarea内内容的行数;或
  • rows 属性中定义的行数(或其默认值)。

这就是为什么在上面的示例中,第二个textarea 将返回 4 而不是 2。一个可能的解决方案是将 rows 属性设置为 1,然后您将始终获得正确的值。

【讨论】:

  • 我添加了 Math.round() 以消除上面代码中计算的不正确小数(JSFiddle 示例没有它,没有它它会得到一个整数)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多