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

如何点击按钮将首个textarea内容作为段落添加到第二个textarea及开发自定义文本编辑器

前端功能实现方案

1. 文本内容追加功能实现

基础DOM结构

<textarea id="inputText" rows="5" placeholder="请输入内容"></textarea>
<button id="addBtn">添加到目标区域</button>
<textarea id="targetText" rows="10" placeholder="目标内容区域"></textarea>

原生JavaScript实现

const addBtn = document.getElementById('addBtn');
const inputText = document.getElementById('inputText');
const targetText = document.getElementById('targetText');

// HTML特殊字符转义,避免XSS风险
function escapeHtml(str) {
  return str.replace(/[&<>"']/g, char => ({
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  }[char]));
}

addBtn.addEventListener('click', () => {
  const content = inputText.value.trim();
  // 空内容不执行添加逻辑
  if (!content) return;
  // 用p标签包裹内容追加到目标textarea
  targetText.value += `<p>${escapeHtml(content)}</p>\n`;
  // 可选:清空输入框
  inputText.value = '';
  // 可选:自动滚动到目标区域底部
  targetText.scrollTop = targetText.scrollHeight;
});

jQuery实现

// 需提前引入jQuery依赖
$('#addBtn').on('click', function() {
  const content = $('#inputText').val().trim();
  if (!content) return;
  // 追加内容到目标textarea
  $('#targetText').val((_, oldVal) => oldVal + `<p>${escapeHtml(content)}</p>\n`);
  $('#inputText').val('');
  $('#targetText').scrollTop($('#targetText')[0].scrollHeight);
});

2. 带内联编辑、删除能力的自定义文本编辑器实现

注意:原生textarea仅支持纯文本输入,无法渲染DOM元素和交互按钮,因此需要将第二个textarea调整为「可视化交互容器 + 隐藏存储textarea」的组合结构,交互在可视化容器完成,数据自动同步到隐藏textarea用于表单提交。

调整后的DOM结构

<textarea id="inputText" rows="5" placeholder="请输入内容"></textarea>
<button id="addBtn">添加到编辑器</button>
<!-- 可视化交互容器 -->
<div id="editorContainer" style="border: 1px solid #dcdfe6; min-height: 200px; padding: 10px; border-radius: 4px;"></div>
<!-- 隐藏存储域,用于提交数据 -->
<textarea id="targetText" hidden name="content"></textarea>

完整交互逻辑实现

const addBtn = document.getElementById('addBtn');
const inputText = document.getElementById('inputText');
const editorContainer = document.getElementById('editorContainer');
const targetText = document.getElementById('targetText');

// HTML特殊字符转义
function escapeHtml(str) {
  return str.replace(/[&<>"']/g, char => ({
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  }[char]));
}

// 同步编辑器内容到隐藏存储域
function syncContent() {
  targetText.value = editorContainer.innerHTML;
}

// 添加段落逻辑
addBtn.addEventListener('click', () => {
  const content = inputText.value.trim();
  if (!content) return;

  // 1. 创建段落容器
  const paraBlock = document.createElement('div');
  paraBlock.style = 'display: flex; gap: 8px; align-items: flex-start; margin-bottom: 10px; padding: 8px; border: 1px solid #f0f0f0; border-radius: 4px;';

  // 2. 创建可编辑内容区域
  const contentEl = document.createElement('p');
  contentEl.contentEditable = true;
  contentEl.style = 'flex: 1; margin: 0; min-height: 22px; outline: none;';
  contentEl.innerText = escapeHtml(content);
  // 内容编辑时自动同步数据
  contentEl.addEventListener('input', syncContent);

  // 3. 创建编辑按钮
  const editBtn = document.createElement('button');
  editBtn.innerText = '编辑';
  editBtn.style = 'flex-shrink: 0; padding: 3px 8px; font-size: 12px; border: none; border-radius: 3px; background: #e8f3ff; color: #409eff; cursor: pointer;';
  editBtn.addEventListener('click', () => {
    contentEl.focus();
    // 自动选中段落全部内容,方便快速编辑
    const range = document.createRange();
    range.selectNodeContents(contentEl);
    const selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
  });

  // 4. 创建删除按钮
  const delBtn = document.createElement('button');
  delBtn.innerText = '删除';
  delBtn.style = 'flex-shrink: 0; padding: 3px 8px; font-size: 12px; border: none; border-radius: 3px; background: #fef0f0; color: #f56c6c; cursor: pointer;';
  delBtn.addEventListener('click', () => {
    paraBlock.remove();
    syncContent();
  });

  // 组装元素到容器
  paraBlock.append(contentEl, editBtn, delBtn);
  editorContainer.append(paraBlock);

  // 同步数据、清空输入框
  syncContent();
  inputText.value = '';
});

可选优化点

  • 给段落块添加hover高亮、编辑中状态高亮的样式,提升交互体验
  • 可扩展支持富文本格式(加粗、斜体、链接等),基于document.execCommand或者集成轻量富文本内核实现
  • 表单提交时直接读取#targetText的value即可获得完整的带结构的内容数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:15:02