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

Lin*_* M. 11 javascript rich-text-editor 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');
    }
});
});

Run Code Online (Sandbox Code Playgroud)

但是,在 MDN Web Docs 上查找此命令时,我发现此命令已过时:

过时 此功能已过时。尽管它可能在某些浏览器中仍然有效,但不鼓励使用它,因为它可以随时被删除。尽量避免使用它。

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

谷歌搜索没有给我任何结果,所以同时,我想知道,该方法被宣布已过时,但没有建议的替代方法怎么可能。

sid*_*ker 10

对 MDN 标记document.execCommand()为过时的更改和https://github.com/mdn/browser-compat-data/commit/2d3890a 上的相关更改部分是由于 https://w3c.github.io/editing /ActiveDocuments/execCommand.html有一个带有以下语句的大红色警告:

该规范不完整,预计不会超出草案状态。作者不应直接使用其中的大部分功能,而应使用 JavaScript 编辑库。本文档中描述的功能未由用户代理一致或完全实现,预计在可预见的未来这不会改变。

至于 vanilla JavaScript 中的任何替换方法,相同的警告框说它是:

预测未来这两个规范都将被内容可编辑和输入事件取代

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

不鼓励使用它……尽量避免使用它。

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

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

不应直接使用其中的大部分功能,而应使用 JavaScript 编辑库

在线富文本编辑器工具(如 CKEditor 和 TinyMCE)中可用的 JavaScript 编辑库document.execCommand()为您“掩盖”了所有潜在的漏洞。如果您尝试document.execCommand()从头开始为原生JavaScript编写自己的健壮处理程序,那么您基本上 - 经过大量的工作和时间 - 最终会重复为创建这些工具底层的 JavaScript 库所做的工作。

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

  • @sideshowbarker:所以-假设人们应该避免`document.execCommand`并且不愿意使用完整的编辑器库(例如TinyMCE),我可能必须使用`window.getSelection()`并找到正确插入`<b的方法>`、`<i>` 等等(或者它们相应的 `<span>` 项以及正确的 CSS 样式),对吗?基本上我应该创建逻辑来正确地用正确的标签和内容替换文本片段 - 当几个“样式”重叠时,这非常困难......多么痛苦:/。 (4认同)

Mar*_*ser 5

看起来新标准将是Input Events Level 2

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