javascript - 如何在 P 中将多个文本节点作为多行获取
问题描述
我正在尝试重现像Disqus评论框这样的内容可编辑的 div。
他们使用一个 contenteditable div
,<p>
里面只有一个。<p>
设置为white-space: pre-wrap
。
在 Chrome 上检查时,他们<p>
的多行标签如下所示:
经过一番研究,我发现双引号表示多个文本节点,所以我尝试了:
const text1 = document.createTextNode('123');
const text2 = document.createTextNode('456');
const text3 = document.createTextNode('789');
root.childNodes[0].appendChild(text1);
root.childNodes[0].appendChild(text2);
root.childNodes[0].appendChild(text3);
现在我明白了,这在检查时是相似的,但它们显示为单行而不是多行:
带有示例的片段
如何在多行中获得“123”“456”“789”?
const root = document.getElementById('root');
const p = document.getElementById('p1');
const text1 = document.createTextNode('123');
const text2 = document.createTextNode('456');
const text3 = document.createTextNode('789');
function handleClick() {
p.appendChild(text1);
p.appendChild(text2);
p.appendChild(text3);
}
#root {
border: 1px dotted blue;
white-space: pre-wrap;
}
<div id="root" contenteditable="true" onClick>
<p id="p1">a</p>
</div>
<button onclick="handleClick()">Click</button>
解决方案
在每个 TextNode 的末尾添加换行符。下面的代码应该可以工作。
const lineBreak='\n';
const root = document.getElementById('root');
const p = document.getElementById('p1');
const text1 = document.createTextNode('123') + lineBreak;
const text2 = document.createTextNode('456') + lineBreak;
const text3 = document.createTextNode('789') + lineBreak;
function handleClick() {
p.appendChild(text1);
p.appendChild(text2);
p.appendChild(text3);
}
推荐阅读
- jcommander - Jcommander解析枚举
- c - 查找进程(task_struct)的最老的孩子(不是兄弟姐妹)
- language-agnostic - 任何数字乘以零等于零,但为什么零的阶乘数等于 1?
- python - 如何使用设置为 IconMode 的 QListView 和设置为 QFileSystemModel 的模型来换行项目文本
- cert-manager - 是否可以仅使用 cert-manager 获取 CA pub 密钥?
- go - os.StartProcess() 不允许在 golang 中使用 sudo 命令
- c# - Nethereum.JsonRpc.Client.RpcResponseException: 错误: 交易恢复没有原因字符串: eth_sendRawTransaction
- java - Sonarqube 关键问题“定义并抛出专用异常而不是使用通用异常”
- asp.net - 如何使用 VB、Asp 和 ORACLE 使用两个文本框和一个按钮刷新我的 GridView
- javascript - 尝试使用 WordPress 的 fusion builder 创建自定义表单,在输入进入 DOM 之前触发事件