使用JavaScript将自定义下拉工​​具添加到心跳编辑器

时间:2019-11-19 21:37:11

标签: javascript dynamic runtime quill

请注意,这是一个自我回答的问题。

Quill编辑器的工具栏模块似乎没有提供使用JavaScript API向其添加自定义工具的方法。您只能从预定义的工具列表中进行选择,或者您必须完全重写工具栏的整个HTML,这似乎非常棘手,通常不是一个选择。由于这种机制,不能仅在运行时添加或删除工具,并且这些工具始终是静态的,这意味着(例如)您不能拥有在运行时加载或更改其条目的动态下拉列表。

“羽毛笔编辑器”本身仅提供添加其他模块的API。因此,您可以编写另一个工具栏模块,以支持原始功能所缺少的上述功能,但是由于有效地重写原始功能需要大量的工作,因此能够继续使用原始功能会更好。 / p>

问题是:如何向现有的Quill Editor实例的工具栏添加诸如下拉菜单之类的潜在动态工具。

1 个答案:

答案 0 :(得分:1)

我写了一个名为DynamicQuillTools的库,可以完成这项工作。

可以这样使用:

@Bean
public MyClient myClient(){
     MyClient c = new MyClient();
     c.setConverter(myJacksonConverter());
     return c;
}

private static MappingJackson2HttpMessageConverter myJacksonConverter() {

}

这是一个完整的演示,在“羽毛笔编辑器”实例中添加了自定义下拉工​​具和自定义按钮:

const dropDownItems = {
    'Mike Smith': 'mike.smith@gmail.com',
    'Jonathan Dyke': 'jonathan.dyke@yahoo.com',
    'Max Anderson': 'max.anderson@gmail.com'
}

const myDropDown = new QuillToolbarDropDown({
    label: "Email Addresses",
    rememberSelection: false
})

myDropDown.setItems(dropDownItems)

myDropDown.onSelect = function(label, value, quill) {
    // Do whatever you want with the new dropdown selection here

    // For example, insert the value of the dropdown selection:
    const { index, length } = quill.selection.savedRange
    quill.deleteText(index, length)
    quill.insertText(index, value)
    quill.setSelection(index + value.length)
}

myDropDown.attach(quill)
// Create a Quill Editor instance with some built-in toolbar tools
const quill = new Quill('#editor', {
    theme: 'snow',
    modules: {
        toolbar: {
            container: [
                ['bold', 'italic', 'underline', 'strike'],
                ['blockquote', 'code-block'],

                [{ 'header': 1 }, { 'header': 2 }],
                [{ 'list': 'ordered' }, { 'list': 'bullet' }],
                [{ 'script': 'sub' }, { 'script': 'super' }],
                [{ 'indent': '-1' }, { 'indent': '+1' }],
                [{ 'direction': 'rtl' }],

                [{ 'size': ['small', false, 'large', 'huge'] }],
                [{ 'header': [1, 2, 3, 4, 5, 6, false] }],

                [{ 'color': [] }, { 'background': [] }],
                [{ 'font': [] }],
                [{ 'align': [] }],

                ['clean'],
            ]
        }
    }
})


// Add a custom DropDown Menu to the Quill Editor's toolbar:

const dropDownItems = {
    'Mike Smith': 'mike.smith@gmail.com',
    'Jonathan Dyke': 'jonathan.dyke@yahoo.com',
    'Max Anderson': 'max.anderson@gmail.com'
}

const myDropDown = new QuillToolbarDropDown({
    label: "Email Addresses",
    rememberSelection: false
})

myDropDown.setItems(dropDownItems)

myDropDown.onSelect = function(label, value, quill) {
    // Do whatever you want with the new dropdown selection here

    // For example, insert the value of the dropdown selection:
    const { index, length } = quill.selection.savedRange
    quill.deleteText(index, length)
    quill.insertText(index, value)
    quill.setSelection(index + value.length)
}

myDropDown.attach(quill)


// Add a custom Button to the Quill Editor's toolbar:

const myButton = new QuillToolbarButton({
    icon: `<svg viewBox="0 0 18 18"> <path class="ql-stroke" d="M5,3V9a4.012,4.012,0,0,0,4,4H9a4.012,4.012,0,0,0,4-4V3"></path></svg>`
})
myButton.onClick = function(quill) {
    // Do whatever you want here. You could use this.getValue() or this.setValue() if you wanted.

    // For example, get the selected text and convert it to uppercase:
    const { index, length } = quill.selection.savedRange
    const selectedText = quill.getText(index, length)
    const newText = selectedText.toUpperCase()
    quill.deleteText(index, length)
    quill.insertText(index, newText)
    quill.setSelection(index, newText.length)
}
myButton.attach(quill)