在定制编辑器中嵌入自定义在线印迹后插入未定义印迹

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

我正在Twitter上工作,例如用户对Quill编辑器的提及。

我的自定义印迹代码是

import Quill from 'quill';

const Base = Quill.import('blots/inline');

export default class MentionBlot extends Base {
static create(data) {
  const node = super.create(data.name);
  node.innerHTML = `@${data.name}`;
  node.setAttribute('contenteditable', false);
  node.setAttribute('name', data.name);
  node.setAttribute('id', data.id);
  return node;
}

MentionBlot.blotName = 'usermention';
MentionBlot.tagName = 'aumention';

我正在下拉列表中显示用户列表。每当单击用户名之一时,我便将用户作为@ User嵌入到羽毛笔编辑器中。

这是我为此编写的click事件。我在这里所做的是用自定义的Inline印迹替换@之后输入的文本用户。

  searchResult.forEach(element => {
    element.addEventListener('click', e => {
      e.preventDefault();
      e.stopPropagation();

      const quillEditor = window.editor;
      const content = quillEditor.getText();

      const quillRange = quillEditor.selection.savedRange; // cursor position
      if (!quillRange || quillRange.length != 0) return;
      const cursorPosition = quillRange.index;
      let mentionStartAt = 0;
      let lengthToBeDeleted = 0;
      for (let i = cursorPosition - 1; i >= 0; --i) {
        const char = content[i];
        if (char == '@') {
          mentionStartAt = i;
          lengthToBeDeleted += 1;
          break;
        } else {
          lengthToBeDeleted += 1;
        }
      }
      const data = {
        name: element.innerHTML,
        id: element.getAttribute('id')
      };

      quillEditor.deleteText(mentionStartAt, lengthToBeDeleted);
      quillEditor.insertEmbed(mentionStartAt, 'usermention', data, 'api');
      const cursorAfterDelete =
        quillEditor.selection.savedRange.index + element.innerHTML.length;

      quillEditor.insertText(cursorAfterDelete + 1, ' ', 'api');
      quillEditor.setSelection(cursorAfterDelete + 2, 'api');
      quillEditor.format('usermention', false, 'api');

    });
  });
}

直到这里,一切都像魅力一样工作,但是我所面临的问题是插入嵌入的usermention污点之后,如果用户在键盘上输入Enter button转到新行,Quill的handleEnter ()函数被触发,并且正在向编辑器中插入@@ undefined用户注释污点。

执行上述功能后,我的编辑器状态是这里。Editor before hitting enter

当我按Enter转到新行时,这是handleEnter()函数的调试状态-鹅毛笔

handleEnter() debugger state

@@ undefined usermention已插入编辑器。我希望用户输入新行。

@undefined in Quill editor

当用户按下Enter键时,我了解到quill.format()返回的是usermention:true。但是,如果用户在再输入几个字符后按Enter键,则会将他带到新行,并且在这种情况下quill.format()为空。

有人可以在这方面帮助我。谢谢。

javascript quill ngx-quill
1个回答
0
投票

参考:https://quilljs.com/docs/modules/keyboard/

使用鹅毛笔键盘绑定处理输入要比向其添加addLister容易,以下方法可帮助您在鹅毛笔编辑器中触发输入事件时进行处理

var quill = new Quill('#editor', modules: {
keyboard: {
  bindings: bindings
}}});


var bindings = {
  handleEnter: {
    key: '13', // enter keycode
    handler: function(range, context) {
       //You can get the context here
    }
  }
};

我希望以上回答适合您的需求。

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