javascript - 如何拆分文本区域中的段落行。请使用纯 Javascript

标签 javascript html css

我正在尝试用 JavaScript 编写一个简单的 markdown。将段落行拆分为新行时出现问题。

我的代码:

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>

注意:

I would not recommend using innerHTML + RegEx if you are going to work with large amount of data (in this case, text).

原因是它们都很慢并且可能对您的应用程序性能影响很小。

替代方案:

  • 要替换正则表达式的使用: 使用 JavaScript 的 split() 函数检索可编辑 div 中的行。

  • 替换 innerHTML: 使用 JavaScript 的 createElement("p") 创建段落并使用 innerText 附加文本。

  • 附加到您的输出 div: 使用 element.append([Elements Object]) 而不是 element.innerHTML

这样做的原因是使用 innerHTML 将把所有内容解析为 HTML(即使只是文本)的任务交给了 JavaScript。这并不意味着 JavaScript 无法处理 HTML 解析,它只是可能会影响您的应用程序性能。这就是为什么这个注释只是一个建议,如果你还不知道的话。

当使用 str.replace() 时,RegEx 也会发生同样的事情。

替代示例:

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>

关于javascript - 如何拆分文本区域中的段落行。请使用纯 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56614975/

相关文章:

javascript - 是否可以使用一些自定义选项调用 $ ('form' ).validationEngine ('validate' )?

javascript - NodeJS - 如何匹配一次?

javascript - Angular 2组件@Input不工作

html - 样式标题不断插入缩略图

c# - 修复 xaml 文件中的大小

javascript - 使用 UnderscoreJS 从数组中删除一个项目

html - 使用html提交按钮获取CSS问题

html - CSS overflow-y 属性 - 滚动 div

html - 带有图像的语义 UI 中的列表项将文本向下推

CSS 工作,当移动到实时 MediaWiki 时在 Chrome 上中断