javascript - 具有 DOM Range 和内容可编辑功能的构建编辑器

标签 javascript ecmascript-6 contenteditable rich-text-editor

我正在尝试使用 DOM Range 构建一个文本编辑器。假设我正在尝试将选定的文本加粗。我使用以下代码来完成此操作。但是,如果粗体已经加粗,我不知道如何删除它。我试图在不使用 execCommand 函数的情况下完成此任务。

this.selection = window.getSelection();
this.range = this.selection.getRangeAt(0);

let textNode = document.createTextNode(this.range.toString());
let replaceElm = document.createElement('strong');

replaceElm.appendChild(textNode);
this.range.deleteContents();
this.range.insertNode(replaceElm);

this.selection.removeAllRanges();

基本上,如果选择范围包含在 <strong> 中标签,我想删除它。

最佳答案

好吧,我起草了这段代码。它基本上抓取当前选定的节点,获取文本内容并删除样​​式标签。

// Grab the currenlty selected node
// e.g. selectedNode will equal '<strong>My bolded text</strong>'
const selectedNode = getSelectedNode();

// "Clean" the selected node. By clean I mean extracting the text
// selectedNode.textContent will return "My bolded text"
/// cleandNode will be a newly created text type node [MDN link for text nodes][1]
const cleanedNode = document.createTextNode(selectedNode.textContent);

// Remove the strong tag
// Ok so now we have the node prepared. 
// We simply replace the existing strong styled node with the "clean" one. 
// a.k.a undoing the strong style.
selectedNode.parentNode.replaceChild(cleanedNode, selectedNode);

// This function simply gets the current selected node. 
// If you were to select 'My bolded text' it will return 
// the node '<strong> My bolded text</strong>'
function getSelectedNode() {
    var node,selection;

    if (window.getSelection) {
      selection = getSelection();
      node = selection.anchorNode;
    }
    if (!node && document.selection) {
        selection = document.selection
        var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange();
        node = range.commonAncestorContainer ? range.commonAncestorContainer :
               range.parentElement ? range.parentElement() : range.item(0);
    }
    if (node) {
      return (node.nodeName == "#text" ? node.parentNode : node);
    }
};

我不知道这是否是“生产”就绪的解决方案,但我希望它有帮助。这应该适用于简单的情况。我不知道它会如何应对更复杂的情况。通过富文本编辑,事情可能会变得非常难看。

随时通知我:)

关于javascript - 具有 DOM Range 和内容可编辑功能的构建编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34959005/

相关文章:

javascript - 在 Meteor 集合中具有一致的客户端 session ID

javascript - 在 native javascript promise 链中利用控制台日志记录

ruby-on-rails - 在 React-Rails 应用程序中,将实例变量从 Controller 传递到组件(并返回)

javascript - 仅将样式应用于可编辑内容中的选定文本 <p>

javascript - React Contenteditable - 如何将 onClick 分配给react-contenteditable 中的 <span> ?

javascript - 为什么找不到我自己的自定义模块?

javascript - 如果出现部分网址或短网址,如何重定向原始网址

javascript - 如何使用 throttle 来获取事件目标?

javascript - “箭头功能”和“功能”是否等效/可互换?