如何让textarea标签中的内容原格式输出?

156 阅读2分钟

如何让 textarea 标签中的内容原格式输出?

在 Web 开发中,<textarea> 标签用于获取用户的多行文本输入。由于 HTML 的特性,直接输出 <textarea> 中的内容时,可能会导致格式丢失,比如换行和空格等。为了保持用户输入的原格式输出,通常有以下几种方法。

1. 使用 CSS 来处理换行

在输出文本的地方,可以通过 CSS 的 white-space 属性来保持文本的原格式。可以使用 white-space: pre-wrap; 来保留换行和空格。

<textarea id="myTextarea" rows="5" cols="30"></textarea>
<button onclick="outputText()">输出文本</button>
<div id="output" style="white-space: pre-wrap; border: 1px solid #ccc; padding: 10px;"></div>

<script>
function outputText() {
    const textareaValue = document.getElementById('myTextarea').value;
    document.getElementById('output').innerText = textareaValue; // 使用 innerText 保留格式
}
</script>

解释:

  • white-space: pre-wrap; 允许文本保留空格和换行。
  • innerText 确保直接输出的文本格式被保留。

2. 使用 JavaScript 的 innerHTML

在某些情况下,可以使用 innerHTML 将文本作为 HTML 插入。这种方法需要对用户输入的文本进行 HTML 转义,以避免 XSS 攻击。

<textarea id="myTextarea" rows="5" cols="30"></textarea>
<button onclick="outputText()">输出文本</button>
<div id="output"></div>

<script>
function escapeHtml(unsafe) {
    return unsafe
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;");
}

function outputText() {
    const textareaValue = document.getElementById('myTextarea').value;
    const escapedValue = escapeHtml(textareaValue);
    document.getElementById('output').innerHTML = escapedValue.replace(/\n/g, "<br>"); // 替换换行符为 <br>
}
</script>

解释:

  • escapeHtml 函数用于对文本进行转义,防止 XSS 攻击。
  • 使用 replace(/\n/g, "<br>") 将换行符替换为 <br> 标签。

3. 使用 Markdown 或其他文本格式

如果希望支持更复杂的文本格式(如 Markdown),可以使用相应的库将输入的文本解析成 HTML。例如,使用 marked.js 库。

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.css">
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

<textarea id="myTextarea" rows="5" cols="30"></textarea>
<button onclick="outputText()">输出文本</button>
<div id="output" class="markdown-body"></div>

<script>
function outputText() {
    const textareaValue = document.getElementById('myTextarea').value;
    const htmlContent = marked(textareaValue); // 使用 marked.js 解析 Markdown
    document.getElementById('output').innerHTML = htmlContent;
}
</script>

解释:

  • 引入 marked.js 库以解析 Markdown 格式的文本。
  • 输出区域使用 class="markdown-body" 来应用 GitHub 风格的样式。

4. 处理空格

如果希望处理用户输入的多个空格,可以在输出时使用 CSS 的 font-family: monospace; 来让空格更加明显。

<textarea id="myTextarea" rows="5" cols="30"></textarea>
<button onclick="outputText()">输出文本</button>
<div id="output" style="font-family: monospace; white-space: pre;"></div>

<script>
function outputText() {
    const textareaValue = document.getElementById('myTextarea').value;
    document.getElementById('output').innerText = textareaValue; // 使用 innerText 保留格式
}
</script>

解释:

  • font-family: monospace; 让每个字符占用相同的宽度,从而更好地显示空格。
  • white-space: pre; 完全保留文本的原格式。

总结

通过以上方法,可以有效地保持 <textarea> 标签中的内容原格式输出。无论是使用 CSS 的 white-space 处理换行,还是通过 JavaScript 的 innerTextinnerHTML,或者引入 Markdown 解析库,开发者都可以根据具体需求选择合适的方式来实现。