一对文本区域根据文本输入自动增长和缩小

Posted

技术标签:

【中文标题】一对文本区域根据文本输入自动增长和缩小【英文标题】:A pair of textareas to auto grow and shrink based on text entry into one 【发布时间】:2022-01-19 17:42:18 【问题描述】:

我有两个<textarea>s,一个可编辑ta2 一个不是ta1。它们都需要在文本输入到可编辑文本时展开,并在删除文本时缩小。

    <div
      class="items-center p-2 align-top"
      v-if="isFirstColumn(index)"
    >
      <textarea class="resize-none" id="ta1" cols="30" rows="5" v-model="row.value" readonly="true" />
    </div>
    <span v-else>
      <textarea @input="autoGrow($event.target)" class="resize-none" id="ta2" cols="30" rows="5" v-model="row.value" />
    </span>

事件处理程序:

private autoGrow(element) 
  if ((element.scrollHeight)+'px' > (document.getElementById('ta1') as htmlTextAreaElement).style.height) 
    element.style.height = 'auto';
    element.style.height = (element.scrollHeight)+'px';
    (document.getElementById('ta1') as HTMLTextAreaElement).style.height = 'auto';
    (document.getElementById('ta1') as HTMLTextAreaElement).style.height = (element.scrollHeight)+'px';
  
  else    
    (document.getElementById('ta1') as HTMLTextAreaElement).style.height = 'auto';
    (document.getElementById('ta1') as HTMLTextAreaElement).style.height = ((document.getElementById('ta1') as HTMLTextAreaElement).scrollHeight)+'px';
    element.style.height = (document.getElementById('ta1') as HTMLTextAreaElement).style.height;
  

当在 ta2 中输入更多文本时,一旦 ta2 的大小超过 ta1,它们都会开始扩展。 但是,在删除文本时,我遇到了一个问题:尽管 ta2 中还有更多文本,但每隔一次删除它就会跳回 ta1 的大小。这是因为将它们设置为相同的高度然后退格。我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

自动调整大小的来源:Creating a textarea with auto-resize

选项 2(纯 JavaScript)

简单 (将此 javascript 添加到您的主脚本文件中,然后忘记它。)

const tx = document.getElementsByTagName("textarea");
for (let i = 0; i < tx.length; i++) 
  tx[i].setAttribute("style", "height:" + (tx[i].scrollHeight) + "px;overflow-y:hidden;");
  tx[i].addEventListener("input", OnInput, false);


function OnInput() 
  this.style.height = "auto";
  this.style.height = (this.scrollHeight) + "px";

为您提供示例代码!

const tx = document.getElementsByTagName("textarea");
for (let i = 0; i < tx.length; i++) 
  tx[i].setAttribute("style", "height:" + (tx[i].scrollHeight) + "px;overflow-y:hidden;");
  tx[i].addEventListener("input", OnInput, false);


function OnInput() 
  this.style.height = "auto";
  this.style.height = (this.scrollHeight) + "px";
<div class="items-center p-2 align-top" v-if="isFirstColumn(index)">
      <textarea class="resize-none" id="ta1" cols="30" v-model="row.value" readonly="true"></textarea>
    </div>
    <span v-else>
      <textarea class="resize-none" id="ta2" cols="30" v-model="row.value"></textarea>
    </span>

【讨论】:

以上是关于一对文本区域根据文本输入自动增长和缩小的主要内容,如果未能解决你的问题,请参考以下文章

我可以使文本区域与文本一起增长到最大高度吗?

javascript/react 动态高度文本区域(最大停止)

Robot Selenium - 在 CodeMirror 文本区域中输入文本

创建具有自动调整大小的文本区域

使用 php curl 自动填充文本区域

根据内容自动调整文本区域的大小[重复]