document.execCommand 有替代品吗? (或者使用 document.execCommand 安全吗?)

Is there a replacement for document.execCommand? (or is it safe to use document.execCommand?)

我正在使用 vanilla JavaScript 构建业余富文本编辑器,而 document.execCommand() 对于启用文本编辑器的核心功能至关重要。

例如粗体、斜体和无序列表命令:

Array.from(toolbarBtn).forEach(btn => {
  btn.addEventListener('click', (e) => {
    e.preventDefault();
    if (e.target.id === "toolbar__btn--bold") {
      format('bold');
    }
    if (e.target.id === "toolbar__btn--italic") {
      format('italic');
    }
    if (e.target.id === "toolbar__btn--unorderedlist") {
      format('insertunorderedlist');
    }
});
});

然而,当在 MDN Web Docs 上查找这个命令时,我看到这个命令被认为是过时的:

Obsolete This feature is obsolete. Although it may still work in some browsers, its use is discouraged since it could be removed at any time. Try to avoid using it.

所以,我想知道在 vanilla JavaScript 中是否有任何替代方法可以像 execCommand() 那样创建富文本编辑器的所有功能?

Google 搜索没有给我任何结果,所以与此同时,我想知道,怎么可能宣布该方法已过时,却没有建议任何替代方法。

对 MDN 的更改将 document.execCommand() 标记为已过时,并且 https://github.com/mdn/browser-compat-data/commit/2d3890a were made in part to due to https://w3c.github.io/editing/ActiveDocuments/execCommand.html 处的相关更改具有带有以下语句的大红色警告:

This spec is incomplete and it is not expected that it will advance beyond draft status. Authors should not use most of these features directly, but instead use JavaScript editing libraries. The features described in this document are not implemented consistently or fully by user agents, and it is not expected that this will change in the foreseeable future.

就原版 JavaScript 中的任何替换方法而言,相同的警告框表示:

predicted that in the future both specs will be replaced by Content Editable and Input Events

......但遗憾的是,我们还没有到那一步。所以不幸的是,目前的情况是,即使我们还没有替代品,我们知道 document.execCommand() 现在不能跨浏览器互操作 - 浏览器项目不会修复它。这就是为什么 MDN 警告说:

its use is discouraged… Try to avoid using it.

所以,正如上面的评论所说,它类似于拖放的情况:众所周知,它会以多种方式被破坏,而且这种情况已经存在很长时间了,因为修复它基本上是不实用。

这就是为什么规范中的红色警告框还表示开发人员和作者:

should not use most of these features directly, but instead use JavaScript editing libraries

CKEditor 和 TinyMCE 等在线富文本编辑器工具中可用的 JavaScript 编辑库为您“掩盖”了 document.execCommand() 中的所有潜在缺陷。如果你试图从头开始为 document.execCommand() in vanilla JavaScript 编写你自己的健壮处理,你基本上 - 经过大量的工作和时间 - 最终会重复已经完成的工作创建这些工具下的 JavaScript 库。

所以底线是:为了节省大量时间和工作,请使用可用的库之一。

看来新标准将是 Input Events Level 2

在我看来,它试图解决 execCommand 的痛点。