如何向Quill.js添加新格式(<hr>标签)?

Sui*_*sse 37 html javascript quill

我想添加一个按钮,<hr>quill.js(beta)编辑器添加一个标签.

这里小提琴.

<!-- Initialize Quill editor -->
    <div id="toolbar-container">
        <span class="ql-formats">
          <button class="ql-hr"></button>  //here my hr-button
        </span>
        <span class="ql-formats">
          <button class="ql-bold"></button>
          <button class="ql-italic"></button>
        </span>
    </div>

    <div id="editor">

      <p>Hello World!</p>
      <hr> // this gets replaced by <p> tag automatically *strange*
      <p>Some initial <strong>bold</strong> text</p>
    </div>
Run Code Online (Sandbox Code Playgroud)

我初始化我的编辑器:

 var quill = new Quill('#editor', {
        modules: {
          toolbar: '#toolbar-container'
        },
        placeholder: 'Compose an epic...',
        theme: 'snow'
      });
Run Code Online (Sandbox Code Playgroud)

在这里,我<h1>为我的编辑器添加了一个标签功能,它非常有效:

  $('.ql-hr').on("click",function(){

      var range = quill.getSelection();      
      var text = quill.getText(range.index, range.length);
      quill.deleteText(range.index, range.length);
      quill.pasteHTML(range.index, '<h1>'+text+'</h1>');
  })
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用相同的<hr>标签,这根本不起作用:

  $('.ql-hr').on("click",function(){

      var range = quill.getSelection();      
      quill.pasteHTML(range.index, '<hr>');
  })
Run Code Online (Sandbox Code Playgroud)

<hr>初始中的标记div#editor被替换为<p>标记.我添加的按钮功能不适用于<hr>标签,但对于其他标签,它可以工作.我知道<hr>标签没有实现到Quill.js,这也是我得到这个控制台输出的原因:

quill:工具栏忽略附加到不存在的格式hr select.ql-hr

有没有什么办法解决这一问题?

Sui*_*sse 46

我仍然不知道为什么这个问题有downvotes,但是这里有解决方案:

导入嵌入污点 - 重要:不是"阻塞",不是"嵌入","阻止/嵌入"!

var Embed = Quill.import('blots/block/embed');
Run Code Online (Sandbox Code Playgroud)

定义一个扩展Embed的新类

class Hr extends Embed {
    static create(value) {
        let node = super.create(value);
        // give it some margin
        node.setAttribute('style', "height:0px; margin-top:10px; margin-bottom:10px;");
        return node;
    }
}
Run Code Online (Sandbox Code Playgroud)

定义您的标签

Hr.blotName = 'hr'; //now you can use .ql-hr classname in your toolbar
Hr.className = 'my-hr';
Hr.tagName = 'hr';
Run Code Online (Sandbox Code Playgroud)

为<hr>按钮编写自定义处理程序

var customHrHandler = function(){
    // get the position of the cursor
    var range = quill.getSelection();
    if (range) {
        // insert the <hr> where the cursor is
        quill.insertEmbed(range.index,"hr","null")
    }
}
Run Code Online (Sandbox Code Playgroud)

注册您的新格式

Quill.register({
    'formats/hr': Hr
});
Run Code Online (Sandbox Code Playgroud)

使用HTML中的正确选择器实例化编辑器

var quill = new Quill('#editor', {
    modules: {
        toolbar: { container: '#toolbar-container',
            handlers: {
                'hr': customHrHandler
            }
        }
    },
    theme: 'snow'
});
Run Code Online (Sandbox Code Playgroud)

HTML部分保持不变.整个<hr>功能可以与<img>格式类似地完成.

谢谢,你们有帮助的社区.

  • Thx,但它会触发一个提示框。你知道怎么禁用吗?@瑞士 (2认同)

pra*_*6x7 5

没有足够的代表发表评论,因此发布作为答案,以解决一个小问题。

@Suisse 的精彩答案中显示的嵌入引起的默认提示框似乎必须在工具栏处理程序中处理(带有第二个参数),如下所示:

var toolbarOptions = {
  handlers: {
    // ...
    'hr': function(value) {
       this.quill.format('hr', true);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

来源讨论-
文档:通过工具栏模块调用自定义嵌入印迹时如何避免默认“提示”

工具栏处理程序文档中的提示示例:https ://quilljs.com/docs/modules/toolbar/#handlers