javascript - 如何在文本区域中拆分段落行。请纯Javascript
问题描述
我正在尝试用 JavaScript 编写一个简单的降价。将段落行拆分为新行时遇到问题。
我的代码:
function parseStr(str) {
str.replace(/(.+)/gm, '<p>$1</p>');
}
var t = document.getElementById("textbox");
t.addEventListener("keyup", function() {
var reOut = parseStr(t.innerText);
document.getElementById("div1").innerHTML = reOut;
});
.box {
display: flex;
height: 100%;
margin: 0;
}
.subbox {
width: 100%;
margin: 10px;
border: solid #981b1e;
outline: none;
}
#textbox,
#div1 {
height: 100%;
}
<div class="box">
<div class="subbox" id="textbox" contenteditable="true"></div>
<div class="subbox" id="div1"></div>
</div>
解决方案
通过阅读您的代码,我发现您的主要问题是您没有从parseStr
函数中返回任何内容。
尝试返回替换的字符串:
function parseStr(str) {
return str.replace(/(.+)/gm, '<p>$1</p>');
}
为提高可读性对代码进行了修复和一些小的更正后,现在可以正常工作了,请参见示例:
const inputDiv = document.querySelector("#textbox");
const outputDiv = document.querySelector("#div1");
function parseStr(str) {
return str.replace(/(.+)/gm, '<p>$1</p>');
}
inputDiv.addEventListener("keyup", function() {
var reOut = parseStr(this.innerText);
outputDiv.innerHTML = reOut;
});
.box {
display: flex;
height: 100%;
margin: 0;
}
.subbox {
width: 100%;
margin: 10px;
border: solid #981b1e;
outline: none;
}
#textbox,
#div1 {
height: 100%;
}
<div class="box">
<div class="subbox" id="textbox" contenteditable="true"></div>
<div class="subbox" id="div1"></div>
</div>
笔记:
如果您要处理大量数据(在本例中为文本),我不建议您使用 innerHTML + RegEx。
原因是它们都很慢,并且可能对您的应用程序性能产生很小的影响。
选择:
替换 RegEx 的使用: 使用 JavaScript 的
split()
函数来检索可编辑 div 中的行。要替换 innerHTML: 使用 JavaScript 创建段落
createElement("p")
并使用innerText
.附加到您的输出 div: 使用
element.append([Elements Object])
而不是element.innerHTML
.
这样做的原因是 usinginnerHTML
将所有内容作为 HTML(即使它只是文本)解析为 JavaScript 的任务。这并不意味着 JavaScript 不能处理 HTML 解析,它只是可能会影响您的应用程序性能。这就是为什么如果你还不知道的话,这篇笔记只不过是一个建议。
RegEx 在使用str.replace()
.
替代示例:
const inputDiv = document.querySelector("#textbox");
const outputDiv = document.querySelector("#div1");
function parseStr(event){
let str = event.target.innerText;
//Clear the output first
outputDiv.innerText = "";
//Obtain every line break inside your editable div
//and filter it (when pressing enter and not typing yet)
let lines = str.split("\n").filter(l=>l!="");
//Create a paragraph in JS for every line and
//append it to your output div
lines.forEach((line)=>{
let pElement = document.createElement("p");
//Use innerText for the paragraph since you don't
//need to have any other HTML inside it
pElement.innerText = line;
outputDiv.append(pElement);
});
}
inputDiv.addEventListener("keyup", parseStr);
.box {
display: flex;
height: 100%;
margin: 0;
}
.subbox {
width: 100%;
margin: 10px;
border: solid #981b1e;
outline: none;
}
#textbox,
#div1 {
height: 100%;
}
<div class="box">
<div class="subbox" id="textbox" contenteditable="true"></div>
<div class="subbox" id="div1"></div>
</div>
推荐阅读
- sql - 即使连接表有空记录,Postgresql 也会选择计数
- typescript - 如何在离子卡中添加谷歌地图?
- amazon-web-services - 在 Elastic Beanstalk 上安装 Sharp
- java - 仅上传图像名称以及数据库中的一些数据,并且仅图像应存储在 Web 内容的文件夹中
- ios - 如何在swift上制作这样的firebase列表
- list - 如何在 tcl 中给单词之间的可变间距?
- reactjs - 如何从销售或店面的环境变量中获取 BACKEND_URL
- c# - 使用 C# 获取 IIS 托管站点 URL 的列表
- node.js - 仅在选中时如何在电子邮件模板中输出复选框值?
- html - core.js:15723 错误类型错误:无法读取未定义的属性“对象”