一般来说,在Quill 1.3稳定版本中,文本可以移动,也就是说,我们可以从内部移动某个列表并将其拖放到某个地方,或者我们可以从某个地方拖放文本,不需要为此做任何额外的事情,即使是在纯文本区域中也是如此.

例如,如果您try 下面的代码,您将看到"Hello World!""世界!"您可以剪切它,并将其留在您的"开始",您将获得剪切和粘贴的效果与拖动.

但是,如果您删除2.0.0dev版本注释行,并使用1.3.6版本注释部分并运行它,如果它不是特别有效,我如何才能使其工作呢?

<link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">

<!-- Create the editor container -->
<div id="editor">
  <p>Hello World!</p>
  <p>Some initial <strong>bold</strong> text</p>
  <p><br></p>
</div>

<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
<!-- 
<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/2.0.0-dev.3/quill.min.js"></script> 
-->

<!-- Initialize Quill editor -->
<script>
  var quill = new Quill('#editor', {
    theme: 'snow'
  });
</script>```

推荐答案

首先是Quill intentionally blocked the dragging,因此在启用它之前确保您有一个适当的用例是很重要的.

Quill 2.0通过在dragstart事件处理程序(handleDragStart)中调用e.preventDefault()来禁用drag events.这个训练员过go 是Quill级的,但现在是has been moved to Scroll to allow overwriting级了.请注意,此更改仅适用于2.0.0-dev.4(和2.0.0-beta.0)之后,因此您不能使用2.0.0-dev.3.

let Scroll = Quill.import('blots/scroll');
class DraggableScroll extends Scroll {
  handleDragStart(e) {}
};
Quill.register(DraggableScroll);

一旦你解决了"拖拽"问题,你还需要解决"拖拽"部分.以下是两种方法:


Method 1: Have the browser handle the insertion like Quill 1.3

uploader模块中的Quill 2.0 blocked the 'drop' event用于文件上传,因此浏览器不会插入拖放的内容.当删除文件或文件夹未触发Drop事件时,您可以阻止Drop事件传播:

let Scroll = Quill.import('blots/scroll');

class DraggableScroll extends Scroll {
    constructor(registry, domNode, { emitter }) {
        super(registry, domNode, { emitter });
        this.domNode.addEventListener('drop', (e) => this.handleDrop(e));
    }

    handleDrop(e) {
        if (e.dataTransfer.files.length == 0)
            e.stopImmediatePropagation();
    }

    handleDragStart(e) { }
}

Quill.register(DraggableScroll);

var quill = new Quill('#editor', {
    theme: 'snow'
});
<link href="https://cdn.quilljs.com/2.0.0-dev.4/quill.snow.css" rel="stylesheet">

<div id="editor">
  <p>Hello World!</p>
  <p>Some initial <strong>bold</strong> text</p>
  <p><br></p>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/2.0.0-dev.4/quill.min.js"></script>


一百零二 您可以创建一个dragend/drop事件处理程序来将拖放的元素移动到它们的拖放位置,而不是让浏览器处理元素的插入.(我现在不知道如何实现,所以我会把它留给其他知道如何实现正确的方法的人.)

let Scroll = Quill.import('blots/scroll');

class DraggableScroll extends Scroll {
    constructor(registry, domNode, { emitter }) {
        super(registry, domNode, { emitter });
        this.domNode.addEventListener('dragend', (e) => this.handleDragEnd(e));
    }

    handleDragStart(e) {
        this.dragged = e.dataTransfer.getData('text/plain');
    }
    
    /*a broken handler for demo purpose*/
    handleDragEnd(e) {
        e.preventDefault();

        const data = this.dragged;
        const selection = quill.getSelection();
        quill.deleteText(selection.index, selection.length);

        let index;
        if (document.caretRangeFromPoint) {
            index = document.caretRangeFromPoint(e.clientX, e.clientY).startOffset;
        } else {
            // firefox
            index = e.rangeOffset;
        }

        quill.insertText(index, data);
        quill.setSelection(index + data.length, 0);
    }
};

Quill.register(DraggableScroll);

var quill = new Quill('#editor', {
    theme: 'snow'
});
<link href="https://cdn.quilljs.com/2.0.0-dev.4/quill.snow.css" rel="stylesheet">

<div id="editor">
  <p>Hello World!</p>
  <p>Some initial <strong>bold</strong> text</p>
  <p><br></p>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/2.0.0-dev.4/quill.min.js"></script>

Javascript相关问答推荐

在JavaScript中检索一些文本

为什么JavaScript双边字符串文字插值不是二次的?

react 路由加载程序行为

使用axios.获取实时服务器时的404响应

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

在286之后恢复轮询

使用LocaleCompare()进行排序时,首先使用大写字母

确保函数签名中的类型安全:匹配值

400 bad request error posting through node-fetch

在FAQ Accodion应用程序中使用React useState时出现问题

如何限制显示在分页中的可见页面的数量

为什么云存储中的文件不能公开使用?

不协调嵌入图片

如何在独立的Angular 应用程序中添加Lucide-Angel?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

递增/递减按钮React.js/Redux

如何设置时间选取器的起始值,仅当它获得焦点时?

如何在加载页面时使锚定标记成为焦点

浮动标签效果移除时,所需的也被移除