在自定义印迹上使用什么、如何以及何时使用静态格式、格式和格式?

2024-01-10

描述

我正在尝试创建一个用于文本突出显示的内联印迹。我知道这个功能已经存在 https://github.com/quilljs/quill/blob/develop/formats/background.js在羽毛笔中。但在我的实现中,我想根据分配的突出显示类型为 html 元素分配不同的值。这是我得到的:

let Inline = Quill.import('blots/inline');

class TextHighlight extends Inline {
    static create(value) {
        let node = super.create();
        if(!value || value < 1) return node;

        if(value == 5){
            node.style.color = 'rgb(225, 225, 225)';
        }
        else {
            node.style.borderRadius = '2px';
            node.style.padding = '2px';

            if(value == 1){ node.style.background = 'rgb(254, 255, 171)'; }
            if(value == 2){ node.style.background = 'rgb(255, 171, 171)'; }
            if(value == 3){ node.style.background = 'rgb(171, 207, 255)'; }
            if(value == 4){ node.style.background = 'rgb(178, 255, 171)'; }
        }

        node.setAttribute('data-value' , value);
        return node;
    }

    formats() {
        console.log('#formats()');
        let result = this.domNode.getAttribute('data-value');
        return result ? result : 0;
    }
}

TextHighlight.blotName = 'texthighlight';
TextHighlight.tagName = 'span';

我的删除/添加功能:

function highlightSelectedText(value) {
   if (value < 0 || value > 5) return false;

   var range = quill.getSelection();

   if (range && range.length > 0) {
      if (value > 0) {
         quill.formatText(
            range.index,
            range.length,
            'texthighlight',
            value,
            true);
      }
      else {
         quill.formatText(range.index, range.length, 'texthighlight', false, false);
      }
   }
}

最后创建 Quill 实例:

var toolbarOptions = {
    container: '#toolbar-container',
    handlers: {
        'texthighlight': function (value) {
            highlightSelectedText(value);
        }
    }
};

var quill = new Quill('#editor', {
    theme: 'bubble',
    modules: {
        toolbar: toolbarOptions
    }
});

存在的问题

  1. 突出显示的文本片段具有以下 Delta:
...
{
   "attributes": {
      "0": "3"
   },
   "insert": "highlighted text"
},
...

“texthighlight”应该出现而不是 0,例如:

...
{
   "attributes": {
      "texthighlight": "3"
   },
   "insert": "highlighted text"
},
...
  1. 如果我多次应用格式,它就会开始累积,将标记放入标记中。例如:

<span class="texthighlight"><span class="texthighlight"><span class="texthighlight"><span class="texthighlight"></span></span></span></span>

预期的行为是仅存在一个亮点。

  1. 我无法删除格式。

结论

毫无疑问,我缺乏如何正确实施这一点的知识。我能够在其他情况下创建更简单的印迹,但现在我真的对覆盖某些印迹方法感到困惑。例如,以下列表显示了我指的方法以及我对每种方法的理解:

  • static formats(node):返回domNode表示的格式。当索引位于格式化范围内时调用选择事件。
  • formats():返回此 Blot 表示的格式。它用于Delta发电。当索引位于格式化范围内时调用选择事件。
  • format(format , value):将格式应用于此印迹。

在重点展示的实现中,仅formats() and create(value)正在被召唤。我知道有一个例子 https://github.com/quilljs/parchment#example这些方法是如何实现的,但我没有得到所需的行为。我认为这是因为我不知道如何具体实施它们。有人可以回答我他们真正做什么、何时被召唤以及他们应该如何表现(实施)?

有人可以帮我吗? :(


编辑(2019 年 12 月 18 日)

所以...经过几个小时的研究,我终于能够让编辑器变得更正确一点。在整个故事中,我最终创建了一个污点,它能够根据传递给格式的值使用不同的样式格式化文本。您甚至可以通过提供或省略值来删除格式。

我终于得到了第 2 项的答案,并且正如我所想,在工具栏模块中找到了它。关于格式方法及其差异,我想我可以更好地理解它。我仍然不明白为什么格式被如此频繁地调用。我想我会在 quill core 中找到答案,但是...... quill 源代码非常大,因为它涉及多个文件。

我在这里放置了之前显示的代码的更新版本。所有内容均已发表评论,有利于任何想要了解更多有关如何执行以下操作的人:

  1. 定义自定义印迹/格式,
  2. 定义接受值并以不同方式表现的印迹 取决于配置的值。
  3. 定义响应并反映工具栏状态的自定义工具栏按钮 编辑器内容。

我希望这将使人们更好地理解如何使用这个工具,并利用它产生更大的兴趣和贡献。

GitHub 上的完整示例 https://github.com/loagit/quill-highlight-example-001

原答案

看来我以某种方式设法得到了想要的结果。我在这里给出答案,但我认为它还不正确,因为它不完整。得到了想要的结果,但是我仍然无法理解事情如何或为何运作。理解这个过程变得很重要,特别是当代码将来需要更改时。下面你可以查看整个项目的代码。要测试,只需运行它。

我剩下的问题是:

  1. 两者有什么区别formats and static formats(domNode)?如果你 观察代码执行,它们被调用几次,并且static formats(domNode)被调用两次。这是正常的吗?我不知道,所以我才问。
  2. 功能内highlightSelectedText(hl),为什么 hl 出现 一个错误的值?这是怎么发生的?
  3. 当应用格式化时,create用来。什么时候 它被删除,format(format, value)叫做。有些代码片段(内部格式)永远无法到达。不应该申请 并删除格式是format-唯一的工作?为什么我必须改变 DOM 元素位于两个不同的位置?

我想我可以通过查看第 2 点找到答案工具栏模块源代码 https://github.com/quilljs/quill/blob/develop/modules/toolbar.js。但我不太确定。如果我能弄清楚这一切,我会回到这里编辑这个答案,好吗?我知道其他人可能也有同样的疑问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在自定义印迹上使用什么、如何以及何时使用静态格式、格式和格式? 的相关文章

  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • JavaScript 中的“new”关键字是什么?

    The newJavaScript 中的关键字第一次遇到时可能会很混乱 因为人们倾向于认为 JavaScript 不是面向对象的编程语言 它是什么 它解决什么问题 什么时候合适 什么时候不合适 它做了 5 件事 它创建一个新对象 这个对象的
  • 无法填充名为“status”的数组

    我正在尝试做一些非常简单的事情 在 Javascript 中初始化一个数组 而且它在 Google Chrome 中不起作用 这是代码 status for i 0 i lt 8 i status i false alert status
  • 缓存 firestore 中 get 的第一个实现

    我希望 firestore 每次都先从缓存中获取数据 根据 Firestore 文档 传递 缓存 或 服务器 选项必须启用相同的功能 下面的例子 db collection cities where capital true get cac
  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • 光滑的旋转木马不工作

    我一直在尝试简单地实现 Slick Carousel 的工作 我已按照 Git 页面上的说明进行操作 https github com kenwheeler slick https github com kenwheeler slick 这
  • jQuery 检查复选框并触发 javascript onclick 事件

    我正在尝试使用 jQuery 检查复选框并在此过程中触发 onclick 事件 假设我在 html 中定义了一个复选框
  • Rails 递归地包含 javascripts 资源文件夹

    我了解如何将一个 JavaScript 文件添加到 Rails 资产管道中 只需添加 require filename 到 application js 但是如何在一个文件夹下包含多个 javascript 文件 vendor assets
  • EJS在JS onload函数中访问express变量

    我知道你可以像这样获取 ejs 文件中变量的值 h1 h1 如果我要在同一个 ejs 页面的 onload javascript 函数中使用相同的标题变量 我将如何使用它 例如 这个函数产生一个控制台错误说 未捕获的语法错误 意外的标识符
  • 获得一次性绑定以适用于 ng-if

    这个问题已经被之前问过 https stackoverflow com questions 23969926 angular lazy one time binding for expressions 但我无法让该解决方案发挥作用 所以我想
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • 从相机视图中拖动锁定在一定距离/半径处的对象

    我在场景中心有一个相机 距离相机 z 400 处有 1 个球体 其父级位于中心 我想从视图中向上 向下 向左 向右拖动球体 但同时不改变它相对于中心的 z 位置 我最终使用了另一个球体并使其不可见 添加side THREE DoubleSi
  • 如何生成 JavaScript 堆栈跟踪? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 关于如何以跨浏览器的方式在 javascript 中生成堆栈跟踪有什么建议吗 较新的浏览器 Chrome 和 Firefox 公开了一个允
  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试
  • 如何从配置加载套接字 io 事件监听器? [复制]

    这个问题在这里已经有答案了 我有使用套接字io 的nodejs 应用程序 我将存储在 config routes js 中的所有事件侦听器 module exports routes auth login controller auth a
  • 使用 JavaScript onclick 添加表格行

    我正在尝试使用 javascript 添加下面找到的完全相同的元素 我已经尝试了这里找到的所有解决方案 我什至尝试用php echo但没有运气 无需更改任何输入名称或类似内容 只需单击该按钮即可向表中添加另一行 仅此而已 这是该元素 tr
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要

随机推荐

  • 从插件添加自定义页面模板

    我正在努力构建我的第一个 WordPress 插件 并且需要它为登录屏幕动态添加自定义页面等 我能找到的唯一接近我需要的东西就在这里 WP 使用插件目录中的文件作为自定义页面模板 https stackoverflow com questi
  • 单线程 JavaScript 下的动画

    JavaScript 是一种单线程语言 因此它一次执行一个命令 异步编程是通过以下方式实现的Web APIs 用于事件处理的 DOM 用于 AJAX 调用的 XMLHttpRequest 用于 setTimeout 的 WindowTime
  • 在 Jenkins 中运行 XCodeBuild 时出现代码签名错误

    不重复类似的问题 如下文进一步解释 从 Jenkins 中运行 XCodeBuild 时出现代码签名错误 但它可以从命令行或 Xcode 中构建正常 过去有几个人遇到过这个问题 他们的共同主题是 Jenkins 在启动时作为守护程序用户运行
  • 在 C# 中动态生成委托类型

    我们有一个要求 需要动态生成委托类型 我们需要根据输入参数和输出生成委托 输入和输出都是简单类型 例如 我们需要生成 int Del int int int string and int Del2 int int string int 任何
  • Super POM,Gradle中层次管理的Parent POM类型

    我们目前使用 Maven 作为构建工具 并且有一个迁移到 Gradle 的指令 我们当前的设置是 我们有一个超级 POM 它定义了所有第三方依赖项 各种插件 distributionManagement URL 并且该 POM 已上传到我们
  • 禁用大型项目​​中的组件

    有很多开发人员和初级人员 我想禁用某些组件 例如
  • 如何在 Chrome 浏览器中调试 AngularJS [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在研究 AngularJS 我想在chrome中调试代码 在 Firefox 中 我可以在 Firebug 的帮助下调试它 任何想法 谢
  • Netty-无法访问类 jdk.internal.misc.Unsafe

    当我将 Java 从 8 升级到 11 时 我收到来自 Netty 的错误 jdk internal misc Unsafe 详细信息如下 我知道这是一条调试级别消息 我可以更改日志级别以忽略它 但我不确定当我忽略它时是否会出现其他问题 例
  • 等待多个 Akka FSM 消息

    我有一个 Akka FSM actor 在收到消息后运行以下伪代码ReadyState lookupA Wrapper Lookup A lookupB Wrapper Lookup B lookupC Wrapper Lookup C g
  • 在 Visual Studio 中折叠相关文件

    在 Visual Studio 中 大多数人都会注意到相关文件可以折叠为一个 例如 Form1 cs Form1 Designer cs 我正在创建一个 DAL 库 并将部分类拆分为多个文件 例如 SomeTableClass cs Som
  • windows下“我的电脑”文件夹的路径是什么?

    我正在使用 Visual Studio IDE 开发 C windowsform 项目 我用CFileDialog类要求用户选择要打开的文件 它显示通常打开的文件选择窗口 我希望显示的默认文件夹与单击 我的电脑 时访问的文件夹相同 其中显示
  • Visual Studio 中的引用属性的别名是什么?

    在 Visual Studio 中的 C 项目中 展开 References 文件夹 然后查看任何引用的属性 您会看到 Aliases 属性 在项目中 该属性具有 全局 值 有人可以告诉我这个属性的用途以及如何使用它吗 Thanks 您可能
  • MySQL 扩展显示

    是否有相当于 psql 的 x 来查看新行中每列的记录 Append G到语句末尾而不是分号 SELECT FROM table name WHERE condition G
  • array_multisort():数组大小不一致[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方法在其子数组的基础上对数组进行排序array multisort 功能 在努力的同时 print r mar echo br arr2 array multisort mar array we
  • R 中的 SVM:“预测器必须是数字或有序的。”

    我是 R 新手 遇到了这个问题 我想比较两种预测技术 支持向量机和神经网络 将它们应用于某些数据 并且我想比较它们的性能 为此 我使用 ROC 曲线 该代码应该计算 ROC 曲线下的面积 但它不起作用 神经网络代码工作正常 但是当 SVM
  • 将谷歌电子表格中的批量数据填充到谷歌表单下拉列表中

    我有一个包含多个部分的谷歌表单 每个部分都有一个下拉列表 我希望从电子表格中提取具有匹配名称的下拉列表的数据 这是我运行的脚本 但它似乎不起作用 function getDataFromGoogleSheets const ss Sprea
  • wagtail页面模型与其自身的多对多关系?

    所以我得到了一个带有 同伴 字段的 PlantDetailPage 模型 是的 植物可以是同伴 其中我应该能够选择其他 PlantDetailPages 我得到了显示的东西 在内联中创建新植物 是的 菜单中的菜单中的菜单 但有几个问题 1
  • 在android中查找从源到目的地的路线方向

    我是android新手 我已经成功编写了显示谷歌地图的代码 我可以给出源地址和目标地址 并使用反向地理编码概念将图钉放置在那里 该场景是我想显示从源点到目的地点的驾驶 步行 骑自行车方向 并显示从源点到目的地的一条线 据我所知 Androi
  • UISwipeGestureRecognizer 无法识别在视图外发起的滑动手势

    func addSwipe self isUserInteractionEnabled true let directions UISwipeGestureRecognizerDirection right left for directi
  • 在自定义印迹上使用什么、如何以及何时使用静态格式、格式和格式?

    描述 我正在尝试创建一个用于文本突出显示的内联印迹 我知道这个功能已经存在 https github com quilljs quill blob develop formats background js在羽毛笔中 但在我的实现中 我想根