You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

禁用状态下的textarea丢失换行符问题求解

问题描述

我有一个设置了white-space: wrap;样式的textarea,然而当该textarea处于disabled状态时,换行符会被忽略。相关代码示例如下:

JavaScript 代码

const textarea = document.querySelector("textarea");

document.querySelector("button").addEventListener("click", (e) => {
  if (!textarea.hasAttribute("disabled")) {
    textarea.setAttribute("disabled", "disabled");
  } else {
    textarea.removeAttribute("disabled", "disabled");
  }
});

CSS 代码

textarea,
textarea:disabled {
  width: 600px;
  height: 100px;
  white-space: wrap;
}

HTML 代码

<textarea wrap="on">1asdfasdf

2afdasdfafdasdfafdasdfaw


3asdfasdf


4asdfasdf</textarea>

<br/>

<button>Toggle 'disabled'</button>

我希望无论textarea是否禁用,其内容显示(包括scrollHeight)都保持一致,请问是否可以实现?


解决方案

可以实现,核心是规避浏览器对禁用状态textarea的特殊排版规则,以下是两种可行方案:

方案1:用readonly+样式模拟禁用状态

浏览器对readonly属性的textarea不会修改文本排版逻辑,我们可以通过CSS模拟禁用的视觉效果,既保留正常的换行和scrollHeight,又让用户感知控件不可编辑:

修改后的JavaScript

const textarea = document.querySelector("textarea");
const btn = document.querySelector("button");

btn.addEventListener("click", (e) => {
  if (!textarea.hasAttribute("readonly")) {
    textarea.setAttribute("readonly", "readonly");
    textarea.classList.add("disabled-style");
  } else {
    textarea.removeAttribute("readonly");
    textarea.classList.remove("disabled-style");
  }
});

补充的CSS

textarea.disabled-style {
  background-color: #eee;
  color: #999;
  cursor: not-allowed;
}

方案2:隐藏textarea同步计算scrollHeight(保留disabled属性)

如果必须使用disabled属性,可以添加一个隐藏的非禁用textarea,同步内容和尺寸,用它的scrollHeight来控制可见textarea的高度:

修改后的HTML

<textarea id="visible-textarea" wrap="on">1asdfasdf

2afdasdfafdasdfafdasdfaw


3asdfasdf


4asdfasdf</textarea>
<textarea id="hidden-textarea" wrap="on" style="position:absolute;top:-9999px;left:-9999px;opacity:0;"></textarea>

<br/>

<button>Toggle 'disabled'</button>

修改后的JavaScript

const visibleTextarea = document.getElementById("visible-textarea");
const hiddenTextarea = document.getElementById("hidden-textarea");
const btn = document.querySelector("button");

// 初始化同步内容与尺寸
hiddenTextarea.value = visibleTextarea.value;
hiddenTextarea.style.width = visibleTextarea.offsetWidth + "px";
visibleTextarea.style.height = hiddenTextarea.scrollHeight + "px";

btn.addEventListener("click", (e) => {
  visibleTextarea.toggleAttribute("disabled");
  // 同步内容并更新高度
  hiddenTextarea.value = visibleTextarea.value;
  visibleTextarea.style.height = hiddenTextarea.scrollHeight + "px";
});

// 内容变化时同步(可选)
visibleTextarea.addEventListener("input", () => {
  hiddenTextarea.value = visibleTextarea.value;
  visibleTextarea.style.height = hiddenTextarea.scrollHeight + "px";
});

内容的提问来源于stack exchange,提问作者Serhii Holinei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:16:11