在 Ctrl+Enter 上可编辑的内容中插入新行

问题描述 投票:0回答:1

我想在用户按 Ctrl+Enter 时在可编辑的内容中插入新行。

基于以下问题,我编写了以下代码:

这是我的 HTML:

<span id="myInput" contenteditable="true" style="white-space: pre;"></span>

这是 JavaScript:

let myInput = document.getElementById('myInput');

myInput.addEventListener('keypress', (event) => {
    if (event.key == 'Enter' && event.ctrlKey == true) {
    event.preventDefault();
    this.insertNewLine();     
   }
})


function insertNewLine(text) {

    var sel, range, html;
  sel = window.getSelection();
  range = sel.getRangeAt(0);
  range.deleteContents();
    
  // Do not always works
  var textNode = document.createTextNode("\n");
  
  // Always works
  //var textNode = document.createTextNode("\n\u200b");
    
  range.insertNode(textNode);
  range.setStartAfter(textNode);
  range.collapse(false);
  sel.removeAllRanges();
  sel.addRange(range);
}

当用户按下 Ctrl+Enter 时,行为有点奇怪:

  • 在 Chrome 上,并不总是插入新行
  • 在 Firefox 上,会插入新行,但插入符号不会跳转到下一行

我注意到,当在

\u200b
字符后面添加零宽度空格 (
\n
) 时,上述代码始终有效。

我做了一个JSFidle:https://jsfiddle.net/Alphonsio/atr7e2uw/27/

当然,我不想插入第二个字符。但我不明白为什么在第一种情况下没有插入新行(仅

\n
)。有人可以帮忙吗?

javascript html contenteditable carriage-return
1个回答
0
投票

使用 < BR /> 代替

document.querySelector("button").addEventListener("click", function() {
  let s = document.querySelector("span");
  console.log("text: " + s.innerHTML);
  //s.textContent = "<br/>" + s.textContent;
  s.innerHTML = "<br/>" + s.innerHTML;
});
span {
  contenteditable: true;
  whitespace: pre;
}
<button>Click me</button>
<p contenteditable=false>ZZZ
<span contenteditable=true>ABC</span>
</p>

© www.soinside.com 2019 - 2024. All rights reserved.