Contenteditable 删除了 firefox 上的尾随空格,但在 Chrome 上没有

Contenteditable removes trailing whitespaces on firefox, but not on Chrome

我有一个简单的

元素作为带有格式化功能的 contenteditable,它即时格式化文本(在输入事件时),并在文本末尾移动插入符号(因为在 contenteditable 上更新 innerHTML 移动插入符号到文本的开头)。

所以在 Chrome 上一切正常,文本在您键入时格式化,但是当使用 Firefox 时,尾随的白色space会在您键入时被删除,所以您不能真正编写两个单独的单词,因为每次您在第一个单词末尾按 space 时,它都会被修剪。

知道为什么 Firefox 上的行为不同吗?

Fiddle: https://jsfiddle.net/mt8cp2sd/

const content = document.getElementById('content');
content.innerHTML = 'Type text here';

function formatText(text) {
  return text.replaceAll('#', '<b>#</b>');
}

content.addEventListener('input', () => {
  content.innerHTML = formatText(content.innerText);

  let range = document.createRange();
  range.selectNodeContents(content);
  range.collapse(false);
  let selection = window.getSelection();
  selection.removeAllRanges();
  selection.addRange(range);
});
#content {
  border: solid 1px #555;
}
<html>

  <body>

    <p id="content" contenteditable>
    </p>

  </body>

</html>

Firefox 在输入 space 时添加 <br>,而 Chrome 添加 &nbsp;

您可以将 contenteditablewhite-space css 属性 设置为 -moz-pre-space 来解决这个问题。

下面是工作代码-

const content = document.getElementById('content');

function formatText(text) {
  return text.replaceAll('#', '<b>#</b>');
}

content.addEventListener('input', () => {
  content.innerHTML = formatText(content.innerText);

  let range = document.createRange();
  range.selectNodeContents(content);
  range.collapse(false);
  let selection = window.getSelection();
  selection.removeAllRanges();
  selection.addRange(range);
});

let data = '';
content.innerHTML = 'Type text here';
#content {
  border: solid 1px #555;
  white-space: -moz-pre-space;
}
<html>

<body>

  <p id="content" contenteditable>
  </p>

</body>

</html>